PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON z innym ORDER BY

Dokumentacja mówi:

DISTINCT ON ( wyrażenie [, ...] ) zachowuje tylko pierwszy wiersz każdego zestawu wierszy, w których podane wyrażenia są równe. [...] Zwróć uwagę, że "pierwszy rząd" każdego zestawu jest nieprzewidywalny, chyba że zostanie użyte polecenie ORDER BY, aby upewnić się, że żądany rząd pojawi się jako pierwszy. [...] Wyrażenia DISTINCT ON muszą odpowiadać wyrażeniom ORDER BY znajdującym się najbardziej po lewej stronie.

Oficjalna dokumentacja

Musisz więc dodać address_id na zamówienie przez.

Alternatywnie, jeśli szukasz pełnego wiersza zawierającego najnowszy zakupiony produkt dla każdego address_id i ten wynik posortowany według purchased_at wtedy próbujesz rozwiązać największą liczbę problemów na grupę, które można rozwiązać za pomocą następujących metod:

Ogólne rozwiązanie, które powinno działać w większości 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

Rozwiązanie bardziej zorientowane na PostgreSQL oparte na odpowiedzi @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

Tutaj wyjaśniono, poszerzono i rozwiązano problem:Wybieranie wierszy uporządkowanych według jednej kolumny i odrębnych w innej



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PGEast, analiza porównawcza sprzętu i farma wydajności PG

  2. Tworzenie bazy danych postgresql przy użyciu psycopg2

  3. Wstaw wiele wierszy w jednej tabeli na podstawie liczby w innej tabeli

  4. Benchmarking Postgres-XL

  5. Jak mogę się zalogować i uwierzytelnić w Postgresql po nowej instalacji?