sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - DISTINCT ON och GROUP BY syntax

För att kunna välja alla kolumner och inte bara object_id och MAX(event_timestamp) , kan du använda DISTINCT ON

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

Om du vill ha resultaten sorterade efter event_timestamp DESC och inte av object_id måste du inkludera det i en härledd tabell eller en 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 ;

Alternativt kan du använda fönsterfunktioner, som 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 ;

eller samla MAX() med 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. Cloud Vendor Deep-Dive:PostgreSQL på Microsoft Azure

  2. Hur man använder ROW_NUMBER i SQLite

  3. lsnrctl starta rane när jag avfyrar det här kommandot detta fel kommer

  4. Så här gör du:Skapa utlösare för ändringsdatum för automatisk uppdatering med SQL Server 2008