PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON с различни ПОРЪЧКИ ПО

Документацията казва:

DISTINCT ON ( израз [, ...] ) запазва само първия ред от всеки набор от редове, където дадените изрази се оценяват на равни. [...] Обърнете внимание, че "първият ред" от всеки набор е непредсказуем, освен ако ORDER BY не се използва, за да се гарантира, че желаният ред се появява първи. [...] Изразът(ите) DISTINCT ON трябва да съвпада с най-левия израз(и) ORDER BY.

Официална документация

Така че ще трябва да добавите address_id по поръчка от.

Като алтернатива, ако търсите пълния ред, който съдържа последния закупен продукт за всеки address_id и този резултат сортиран по purchased_at тогава се опитвате да решите проблем с най-голям N на група, който може да бъде решен чрез следните подходи:

Общото решение, което трябва да работи в повечето СУБД:

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

По-ориентирано към PostgreSQL решение, базирано на отговора на @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

Проблемът е изяснен, разширен и решен тук:Избор на редове, подредени по една колона и различни от друга



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получа броя на неделята на текущия месец в psql?

  2. Най-добрите ETL инструменти за мигриране към PostgreSQL

  3. Как date_trunc() работи в PostgreSQL

  4. Избройте колони с индекси в PostgreSQL

  5. Как да промените кодирането на колекцията на шаблонната база данни