Sbagli! in tutti e due i casi prende risultati a caso.
E' solo un caso che ti prenda risultati recenti ma se non fai OPTIMIZE TABLE e se la tabella è soggetta a numerosi DELETE allora anche questa certezza verrà a meno.

Quando prendi i campi:

cognome,
data,
sesso

che possono comparire in diverse e svariate forme per ogni nome, mysql prende un record a caso, con altissime probabilità il più recente (ma senza alcuna certezza in realtà).

quindi:

lea, rossi, 01, F
lea, bianchi, 02, M

è assolutamente casuale quale di questi due prenderà, presumibilmente l'ultimo inserito ma non è detto assolutamente, la UNION poi fa saltare questa certezza perchè fonde due tabelle e in questo caso i dati vengono presi completamente in base a come viene eseguito e senza un controllo da parte della SELECT.

Per estrarre particolari numeri in GROUP BY puoi usare le funzioni MIN(), MAX() queste funzioni restituiscono all'interno del gruppo il campo con la data più alta o più bassa.

Per i campi testuali invece non esiste un metodo ad hoc per estrarre un campo particolare, poichè non è numerica la scelta e quindi è impossibile chiedere a mysql se:

rossi è >, <, o = a bianchi

Però puoi provare a cercare qualche soluzione usando la funzione IF() che permette di effettuare dei controlli, tuttavia con il GROUP BY e i campi testuali non vai troppo lontano.

Se puoi usa il GROUP_CONCAT e poi estrai il record con la data maggiore.