sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - DISTINCT ON en GROUP BY syntaxis

Om alle kolommen te kunnen selecteren en niet alleen object_id en MAX(event_timestamp) , kunt u DISTINCT ON . gebruiken

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

Als je de resultaten wilt bestellen op event_timestamp DESC en niet door object_id , moet u het opnemen in een afgeleide tabel of een 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 ;

Als alternatief kunt u vensterfuncties gebruiken, zoals 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 ;

of verzamel MAX() met 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. Hoe * plus een andere kolom te selecteren

  2. Voorvertoning van documenten in Microsoft Access-formulier

  3. Een datum converteren in MySQL vanuit een stringveld

  4. Hoe gebruik je reguliere expressie in sql-server?