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

PostgreSQL DISTINCT ON med forskellig ORDER BY

Dokumentationen siger:

DISTINCT ON ( udtryk [, ...] ) beholder kun den første række af hvert sæt rækker, hvor de givne udtryk evalueres til at være lig. [...] Bemærk, at den "første række" i hvert sæt er uforudsigelig, medmindre ORDER BY bruges til at sikre, at den ønskede række vises først. [...] DISTINCT ON-udtrykket skal matche det eller de ORDER BY-udtryk længst til venstre.

Officiel dokumentation

Så du bliver nødt til at tilføje address_id til ordren af.

Alternativt, hvis du leder efter den fulde række, der indeholder det senest købte produkt for hver address_id og det resultat sorteret efter purchased_at så forsøger du at løse det største N pr. gruppe-problem, som kan løses ved følgende tilgange:

Den generelle løsning, der burde virke i de fleste 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 mere PostgreSQL-orienteret løsning baseret 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 afklaret, udvidet og løst her:Valg af rækker ordnet efter en kolonne og adskilt i en anden



  1. Oracle-lagret procedure:returner både resultatsæt og ud-parametre

  2. Opsamling af tæller fra en SQL-forespørgsel

  3. Sådan rettes forkert strengværdi i MySQL

  4. Beregn en løbende total i SQL Server