2016-05-03 23 views
2

In einer Firebird-Datenbank mit einer Tabelle "Sales", muss ich den ersten Verkauf aller Kunden auswählen. Unten sehen Sie ein Beispiel, das die Tabelle und das gewünschte Ergebnis der Abfrage zeigt.Firebird Query-Return erste Zeile jeder Gruppe

--------------------------------------- 
SALES 
--------------------------------------- 
ID CUSTOMERID DTHRSALE 
1 25   01/04/16 09:32 
2 30   02/04/16 11:22  
3 25   05/04/16 08:10 
4 31   07/03/16 10:22 
5 22   01/02/16 12:30 
6 22   10/01/16 08:45 

Ergebnis: nur erster Verkauf, basierend auf dem Verkaufsdatum.

ID CUSTOMERID DTHRSALE 
1 25   01/04/16 09:32 
2 30   02/04/16 11:22  
4 31   07/03/16 10:22 
6 22   10/01/16 08:45 

Ich habe bereits folgenden Code "Select first row in each GROUP BY group?" getestet, aber es hat nicht funktioniert.

Antwort

-2

So einfach wie:

wählen CUSTOMERID min (DTHRSALE) von SALES Gruppe von CUSTOMERID

1

In Firebird 2.5 können Sie dies mit der folgenden Abfrage; dies ist eine geringfügige Modifikation des zweiten Teils von the accepted answer of the question you linked to zu Ihrem Schema und Anforderungen zugeschnitten:

select x.id, 
     x.customerid, 
     x.dthrsale 
    from sales x 
    join (select customerid, 
       min(dthrsale) as first_sale 
      from sales 
     group by customerid) p on p.customerid = x.customerid 
           and p.first_sale = x.dthrsale 
order by x.id 

Die order by ist nicht notwendig, habe ich es nur, um es den Auftrag zu bilden, geben als in Ihrer Frage gezeigt.

Mit Firebird 3 können Sie die Fensterfunktion ROW_NUMBER verwenden, die auch in der verknüpften Antwort beschrieben wird. Die verknüpfte Antwort sagte fälschlicherweise, dass die erste Lösung mit Firebird 2.1 und höher funktionieren würde. Ich habe es jetzt bearbeitet.

0

Suche nach dem Verkauf ohne früheren Verkäufen:

SELECT S1.* 
FROM SALES S1 
LEFT JOIN SALES S2 ON S2.CUSTOMERID = S1.CUSTOMERID AND S2.DTHRSALE < S1.DTHRSALE 
WHERE S2.ID IS NULL 

einen Index über definieren (customerid, dthrsale), um es schnell.

Verwandte Themen