sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON con diferente ORDER BY

La documentación dice:

DISTINCT ON ( expresión [, ...] ) mantiene solo la primera fila de cada conjunto de filas donde las expresiones dadas se evalúan como iguales. [...] Tenga en cuenta que la "primera fila" de cada conjunto es impredecible a menos que se use ORDER BY para garantizar que la fila deseada aparezca primero. [...] La(s) expresión(es) DISTINCT ON debe coincidir con la(s) expresión(es) ORDER BY más a la izquierda.

Documentación oficial

Entonces tendrás que agregar el address_id a la orden por.

Alternativamente, si está buscando la fila completa que contiene el producto comprado más reciente para cada address_id y ese resultado ordenado por purchased_at entonces está tratando de resolver un problema mayor de N por grupo que puede resolverse mediante los siguientes enfoques:

La solución general que debería funcionar en la mayoría de los 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 solución más orientada a PostgreSQL basada en la respuesta de @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 aclarado, extendido y resuelto aquí:Selección de filas ordenadas por alguna columna y distintas en otra