*Markus: Zeilen von anderen Zeilen "subtrahieren"

Beitrag lesen

Hallo,

in einer versauten Tabelle ohne Schlüssel befinden sich Werte, die in etwa so aussehen:

mysql> select * from person;
+------+------------+------+------------+
| id   | name       | age  | gebdat     |
+------+------------+------+------------+
|    1 | Huber      |   37 | 1971-10-10 |
|    1 | Huber      |   37 | 1971-10-10 |
|    1 | Huber      |   37 | 1947-06-23 |
|    2 | Maier      |   37 | 1971-10-09 |
|    2 | Müller     |   30 | 1978-11-10 |
|    3 | Moser      |   44 | 1966-10-10 |
|    3 | Hofer      |   45 | 1966-10-10 |
|    5 | Hauser     |   30 | 1978-10-10 |
|    7 | Hauser     |   31 | 1977-10-10 |
|    7 | Hauser     |   31 | 1979-10-10 |
|    2 | Muster     |   20 | 1989-02-09 |
|    2 | Mustermann |   15 | 1994-12-01 |
|    6 | Musterfrau |   44 | 1966-10-10 |
|   10 | Burger     |   25 | 1983-01-20 |
|   10 | Burger     |   25 | 1983-04-09 |
|   10 | Burger     |   25 | 1983-03-08 |
+------+------------+------+------------+

Hieraus will ich sämtliche doppelte IDs entfernen und bei den IDs, wo unterschiedliche Datumsangaben sind, soll jeweils das höchste Datum überbleiben. Falls gleiche Datumsangaben pro ID vorhanden sind, soll irgend eine Zeile davon über bleiben. Hierzu habe ich folgendes Select-Statement angewendet mit folgendem Ergebnis:

mysql> select id, name, age, max(gebdat) from person group by id;
+------+------------+------+-------------+
| id   | name       | age  | max(gebdat) |
+------+------------+------+-------------+
|    1 | Huber      |   37 | 1971-10-10  |
|    2 | Maier      |   37 | 1994-12-01  |
|    3 | Moser      |   44 | 1966-10-10  |
|    5 | Hauser     |   30 | 1978-10-10  |
|    6 | Musterfrau |   44 | 1966-10-10  |
|    7 | Hauser     |   31 | 1979-10-10  |
|   10 | Burger     |   25 | 1983-04-09  |
+------+------------+------+-------------+
7 rows in set (0.00 sec)

Wie kann ich nun eine Anweisung formulieren, die mir alle Einträge löscht, außer jene, die ich hier als Ergebnis bekommen habe?
Ich dachte an ein Subselect, aber schaffe es nicht, dieses zu formulieren. Auch an Lösungen mit SELF JOINs habe ich gedacht, aber das bringt mir ebenfalls nichts.
Dann habe ich versucht, eine View zu erstellen, die mir diese Werte beinhaltet, aber wenn ich die Person-Tabelle kille, ist die View plötzlich auch leer. Ich hatte vor, die Person-Tabelle zu killen, und die View in die Tabelle neu einzuspielen. Scheint aber doch nicht so leicht zu sein, wie ich es mir dachte.

Markus

--