PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON com ORDER BY diferente


A documentação diz:

DISTINCT ON ( expressão [, ...] ) mantém apenas a primeira linha de cada conjunto de linhas em que as expressões fornecidas são avaliadas como iguais. [...] Observe que a "primeira linha" de cada conjunto é imprevisível, a menos que ORDER BY seja usado para garantir que a linha desejada apareça primeiro. [...] A(s) expressão(ões) DISTINCT ON devem corresponder à(s) expressão(ões) ORDER BY mais à esquerda.

Documentação oficial

Então você terá que adicionar o address_id à ordem de.

Como alternativa, se você estiver procurando a linha completa que contém o produto comprado mais recente para cada address_id e esse resultado classificado por purchased_at então você está tentando resolver o maior problema de N por grupo que pode ser resolvido pelas seguintes abordagens:

A solução geral que deve funcionar na maioria dos DBMSs:
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

Uma solução mais orientada ao PostgreSQL baseada na resposta do @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 esclarecido, estendido e resolvido aqui:Selecionando linhas ordenadas por alguma coluna e distintas em outra