Als vereinfachtes Beispiel muss ich jede Instanz auswählen, bei der ein Kunde eine Lieferadresse hatte, die sich von der vorherigen Lieferadresse unterscheidet. So habe ich eine große Tabelle mit Spalten wie:SQL: Sortieren nach, dann erste Zeile mit unterschiedlichem Wert für mehrere Spalten auswählen
purchase_id | cust_id | date | address | description
-----------------------------------------------------------
1 | 5 | jan | address1 | desc1
2 | 6 | jan | address2 | desc2
3 | 5 | feb | address1 | desc3
4 | 6 | feb | address2 | desc4
5 | 5 | mar | address3 | desc5
6 | 5 | mar | address3 | desc6
7 | 5 | apr | address1 | desc7
8 | 6 | may | address4 | desc8
Beachten Sie, dass Kunden „zurückgehen“, um eine vorherige Adresse als Kunde 5 in Reihe tat 7.
Was ich wählen möchten (und wie so effizient wie möglich, da dies eine ziemlich große Tabelle ist) ist die erste Zeile von jedem "Block", in dem ein Kunde nachfolgende Bestellungen an die gleiche Adresse versandt hat. In diesem Beispiel wären dies die Zeilen 1,2,5,7 und 8. Bei allen anderen hat der Kunde die gleiche Adresse wie bei seiner vorherigen Bestellung.
So effektiv möchte ich zuerst ORDER BY (cust_id, date)
, dann SELECT purchase_id, cust_id, min(date), address, description
.
Allerdings habe ich Probleme, weil SQL GROUP BY
normalerweise vor ORDER BY
getan werden muss. Ich kann daher nicht herausfinden, wie man z.B. eine der Top-Antworten auf this question (die ich sonst ziemlich gerne.) Es ist notwendig (zumindest konzeptionell), nach Datum zu sortieren, bevor gruppieren oder Aggregatfunktionen wie min()
verwenden, sonst würde ich Instanzen wie Zeile 7 in meiner Beispieltabelle vermissen, wo ein Kunde zu einer vorherigen Adresse "zurückbewegte".
Beachten Sie auch, dass zwei Kunden eine Adresse teilen können, also muss ich effektiv nach cust_id
und address
nach der Bestellung nach Datum gruppieren.
Ich bin mit Schneeflocke, die ich glaube, die meisten die gleichen Befehle wie neuere Versionen von PostgreSQL und SQL Server hat (obwohl ich ziemlich neu bin so auf Schneeflocke nicht ganz sicher.)
Haben Sie nur für Kunden mit mehr als einer Adresse zurück Einkäufe wollen? –
Kann 1,2,5,8 statt 1,2,7,8 sein? –
Anthony E: Nein, ich möchte (mindestens) eine Zeile für alle Kunden zurückgeben, die jemals eine Adresse hatten, und mehr Zeilen für Kunden, die die Adressen einmal oder mehrmals geändert haben. Giorgi Nakeuri: Danke, sollte 1,2,5,7 und 8 sein. (Zeilen 5 und 7 haben beide eine andere Adresse als die letzte, die der Kunde benutzt hat.) Bearbeitet. – DNB