sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL ODLIŠUJE S různou ORDER BY

Dokumentace říká:

DISTINCT ON ( výraz [, ...] ) zachová pouze první řádek každé sady řádků, kde jsou dané výrazy vyhodnoceny jako stejné. [...] Všimněte si, že "první řádek" každé sady je nepředvídatelný, pokud není použito ORDER BY k zajištění toho, že se požadovaný řádek objeví jako první. [...] Výraz(y) DISTINCT ON se musí shodovat s výrazem(y) ORDER BY zcela vlevo.

Oficiální dokumentace

Takže budete muset přidat address_id k objednávce do.

Případně, pokud hledáte celý řádek, který obsahuje poslední zakoupený produkt pro každý address_id a výsledek seřazený podle purchased_at pak se snažíte vyřešit největší problém N na skupinu, který lze vyřešit následujícími přístupy:

Obecné řešení, které by mělo fungovat ve většině 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

Řešení více orientované na PostgreSQL založené na odpově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

Zde je problém objasněn, rozšířen a vyřešen:Výběr řádků seřazených podle některého sloupce a odlišných v jiném



  1. Syntaxe Oracle SQL:Uváděný identifikátor

  2. Dotaz k získání pouze čísel z řetězce

  3. Zničení Postgres DB na Heroku

  4. SQLite MIN