sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON met verschillende ORDER BY

Documentatie zegt:

DISTINCT ON ( expression [, ...] ) houdt alleen de eerste rij van elke reeks rijen waar de gegeven expressies gelijk zijn aan. [...] Merk op dat de "eerste rij" van elke set onvoorspelbaar is, tenzij ORDER BY wordt gebruikt om ervoor te zorgen dat de gewenste rij als eerste verschijnt. [...] De DISTINCT ON-uitdrukking(en) moeten overeenkomen met de meest linkse ORDER BY-uitdrukking(en).

Officiële documentatie

U moet dus de address_id . toevoegen naar de bestelling door.

Als alternatief, als u op zoek bent naar de volledige rij met het meest recent gekochte product voor elke address_id en dat resultaat gesorteerd op purchased_at dan probeer je een probleem met de grootste N per groep op te lossen dat kan worden opgelost door de volgende benaderingen:

De algemene oplossing die in de meeste DBMS'en zou moeten werken:

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

Een meer PostgreSQL-georiënteerde oplossing op basis van het antwoord van @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

Probleem verduidelijkt, uitgebreid en opgelost hier:rijen selecteren geordend op een kolom en onderscheiden op een andere



  1. BESTELLEN OP datum en tijd VOORDAT GROEP OP naam in mysql

  2. Wat is een databank? Definitie, typen en componenten

  3. Hoe het verschil in jaren van twee verschillende datums te krijgen?

  4. Hoe localdb afzonderlijk te installeren?