Hallo Wissende,
ich betreue eine Tabelle mit folgenden Aufbau (auf das Wesentliche gekürzt):
- ID (Autowert)
- Kundenkennung (gemischt Buchstaben und Ziffern)
- Status (hier gibt es drei verschiedene Varianten: A, B und C)
In der Tabelle werden nun laufend für die Kunden Stati erfasst. Meistens ist mit der Erfassung eine Statusveränderung verbunden, aber nicht immer. Wenn man mal die Tabelle gedanklich nach den Kunden und dann nach ID sortiert, ist folgendes z.B. möglich:
Kundenkennung ID Status
ABC123 243572 A
ABC123 345578 B
ABC123 345580 B
ABC123 423221 A
Der letzte (aktuelle) Status des Kunden ist also ,,A". Die Statusveränderungen sollen zwar erhalten bleiben, aber nicht, wenn sie redundant sind. Die dritte Erfassung mit der ID 345580 war aber so eine unnötige Doppelerfassung, denn zu diesem Zeitpunkt war der Status schon ,,B".
Ich suche nun einen Ansatz für eine SQL-Query, die diese Dubletten löscht. Ich bin so halbwegs sattelfest in SQL und vermute, dass die Tabelle ,,sich selbst" aufrufen muss, um den Status mit dem nächstälteren Status dieses Kunden zu vergleichen, aber das bekomme ich nicht hin. Ich habe das mit Erstellung von Zwischentabellen zwar am Ende händisch gelöst, aber es soll möglichst nur eine Löschabfrage sein, die dann auch halbwegs effizient vorgeht (zwei Millionen Datensätze!)
Ich bin für jeden Denkanstoß dankbar, vielen Dank im voraus.
Hans-Jürgen
Du willst also nur den dritten Datensatz löschen?
Vorher wäre es sinnvoll, bereits per Eingabeprüfung zu verhindern, solche ungewünschten Datensätze anlegen zu lassen. Müll, den man nicht erzeugt, muss man nicht beseitigen.
Wenn das Kind schon im Brunnen liegt, braucht man so etwas wie Ermittlung Vorgänger/Nachfolger.
Siehe Grundlagen - SQL ist leicht (17) - Differenz aus Datensätzen (https://www.ms-office-forum.net/forum/showthread.php?t=378595)
Löschen ist dann noch etwas anderes als nur anzeigen. Dort müsste man genau und zu Beginn definieren, was genau man löschen will bzw. was man nach Löschen behalten will.