PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON mit unterschiedlichem ORDER BY

Dokumentation sagt:

DISTINCT ON ( expression [, ...] ) behält nur die erste Zeile jedes Satzes von Zeilen bei, in denen die angegebenen Ausdrücke als gleich ausgewertet werden. [...] Beachten Sie, dass die "erste Zeile" jedes Satzes unvorhersehbar ist, es sei denn, ORDER BY wird verwendet, um sicherzustellen, dass die gewünschte Zeile zuerst erscheint. [...] Die DISTINCT ON-Ausdrücke müssen mit den ORDER BY-Ausdrücken ganz links übereinstimmen.

Offizielle Dokumentation

Sie müssen also die address_id hinzufügen zur Bestellung per.

Alternativ, wenn Sie nach der vollständigen Zeile suchen, die das zuletzt gekaufte Produkt für jede address_id enthält und das Ergebnis sortiert nach purchased_at dann versuchen Sie, ein Problem mit den größten N pro Gruppe zu lösen, das durch die folgenden Ansätze gelöst werden kann:

Die allgemeine Lösung, die in den meisten DBMSs funktionieren sollte:

SELECT t1.* FROM purchases t1
JOIN (
    SELECT address_id, max(purchased_at) max_purchased_at
    FROM purchases
    WHERE product_id = 1
    GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC

Eine eher PostgreSQL-orientierte Lösung basierend auf der Antwort von @hkf:

SELECT * FROM (
  SELECT DISTINCT ON (address_id) *
  FROM purchases 
  WHERE product_id = 1
  ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC

Problem hier verdeutlicht, erweitert und gelöst:Auswahl von Zeilen, die nach einer Spalte geordnet und in einer anderen unterschiedlich sind