PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON con ORDER BY diverso

La documentazione dice:

DISTINCT ON ( expression [, ...] ) mantiene solo la prima riga di ogni set di righe in cui le espressioni date restituiscono uguali. [...] Si noti che la "prima riga" di ogni set è imprevedibile a meno che non venga utilizzato ORDER BY per assicurarsi che la riga desiderata appaia per prima. [...] Le espressioni DISTINCT ON devono corrispondere alle espressioni ORDER BY più a sinistra.

Documentazione ufficiale

Quindi dovrai aggiungere il address_id all'ordine entro.

In alternativa, se stai cercando la riga completa che contiene il prodotto acquistato più di recente per ogni address_id e quel risultato ordinato per purchased_at quindi stai cercando di risolvere un problema N per gruppo massimo che può essere risolto con i seguenti approcci:

La soluzione generale che dovrebbe funzionare nella maggior parte dei DBMS:

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

Una soluzione più orientata a PostgreSQL basata sulla risposta di @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

Problema chiarito, esteso e risolto qui:selezione di righe ordinate per una colonna e distinte in un'altra