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

PostgreSQL - syntaxe DISTINCT ON a GROUP BY

Aby bylo možné vybrat všechny sloupce, nejen object_id a MAX(event_timestamp) , můžete použít DISTINCT ON

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

Pokud chcete, aby byly výsledky seřazeny podle event_timestamp DESC a nikoli pomocí object_id , musíte jej zahrnout do odvozené tabulky nebo 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 ;

Případně můžete použít funkce okna, jako je 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 ;

nebo agregovat MAX() s 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. Řešení s vysokou závažností chyb v SQL Server

  2. Vyberte poslední řádek v MySQL

  3. CHYBA 1045 (28000):Přístup odepřen uživateli 'root'@'localhost' (s použitím hesla:ANO)

  4. Zvýšit prohlášení