sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON med olika ORDER BY

Dokumentationen säger:

DISTINCT ON ( uttryck [, ...] ) behåller endast den första raden i varje rad rader där de givna uttrycken evalueras till lika. [...] Observera att den "första raden" i varje uppsättning är oförutsägbar om inte ORDER BY används för att säkerställa att den önskade raden visas först. [...] DISTINCT ON-uttrycken måste matcha ORDER BY-uttrycken längst till vänster.

Officiell dokumentation

Så du måste lägga till address_id till beställningen av.

Alternativt, om du letar efter hela raden som innehåller den senast köpta produkten för varje address_id och det resultatet sorterat efter purchased_at då försöker du lösa ett största N per grupp-problem som kan lösas med följande tillvägagångssätt:

Den allmänna lösningen som borde fungera i de flesta DBMS:er:

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

En mer PostgreSQL-orienterad lösning baserad på @hkfs svar:

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 förtydligat, utökat och löst här:Välja rader ordnade efter någon kolumn och distinkta i en annan



  1. Ytterligare ett 12c Optimizer-vitbok

  2. få JOIN-tabellen som en rad resultat med PostgreSQL/NodeJS

  3. Hur kan jag aktivera MySQL:s långsamma frågelogg utan att starta om MySQL?

  4. Sqlite3 infogar inte flera rader i ordning