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

PostgreSQL - składnia DISTINCT ON i GROUP BY

Aby móc wybrać wszystkie kolumny, a nie tylko object_id i MAX(event_timestamp) , możesz użyć DISTINCT ON

SELECT DISTINCT ON (object_id) 
    object_id, event_timestamp    ---, more columns
FROM test_select 
ORDER BY object_id, event_timestamp DESC ;

Jeśli chcesz uporządkować wyniki według event_timestamp DESC a nie przez object_id , musisz uwzględnić go w tabeli pochodnej lub CTE:

SELECT *
FROM 
  ( SELECT DISTINCT ON (object_id) 
        object_id, event_timestamp    ---, more columns
    FROM test_select 
    ORDER BY object_id, event_timestamp DESC 
  ) AS t
ORDER BY event_timestamp DESC ;

Alternatywnie możesz użyć funkcji okna, takich jak ROW_NUMBER() :

WITH cte AS
  ( SELECT ROW_NUMBER() OVER (PARTITION BY object_id 
                              ORDER BY event_timestamp DESC) 
             AS rn, 
           object_id, event_timestamp    ---, more columns
    FROM test_select 
  )
SELECT object_id, event_timestamp    ---, more columns
FROM cte
WHERE rn = 1
ORDER BY event_timestamp DESC ;

lub zagregować MAX() z OVER :

WITH cte AS
  ( SELECT MAX(event_timestamp) OVER (PARTITION BY object_id) 
             AS max_event_timestamp, 
           object_id, event_timestamp    ---, more columns
    FROM test_select 
  )
SELECT object_id, event_timestamp    ---, more columns
FROM cte
WHERE event_timestamp = max_event_timestamp
ORDER BY event_timestamp 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. ODBC v Libpq:biblioteka C dla PostgreSQL

  2. Tablica Enum w Postgresie z SQLAlchemy

  3. Maksymalna liczba znaków w etykietach (nazwy tabel, kolumny itp.)

  4. Utwórz dużą liczbę całkowitą z dużego końca identyfikatora uuid w PostgreSQL

  5. Postgres:Czy możemy mieć kolumnę auto-inkrementacji w kluczu złożonym?