sqlpostgresqlgreatest-n-per-group

PostgreSQL Selecting Most Recent Entry for a Given ID


Table Essentially looks like:

Serial-ID, ID, Date, Data, Data, Data, etc.

There can be Multiple Rows for the Same ID. I'd like to create a view of this table to be used in Reports that only shows the most recent entry for each ID. It should show all of the columns.

Can someone help me with the SQL select? thanks.


Solution

  • There's about 5 different ways to do this, but here's one:

    SELECT *
    FROM yourTable AS T1 
    WHERE NOT EXISTS(
        SELECT *
        FROM yourTable AS T2
        WHERE T2.ID = T1.ID AND T2.Date > T1.Date
    )
    

    And here's another:

    SELECT T1.*
    FROM yourTable AS T1
    LEFT JOIN yourTable AS T2 ON
    (
        T2.ID = T1.ID 
        AND T2.Date > T1.Date
    )
    WHERE T2.ID IS NULL
    

    One more:

    WITH T AS (
        SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) AS rn
        FROM yourTable
    )
    SELECT * FROM T WHERE rn = 1
    

    Ok, i'm getting carried away, here's the last one I'll post(for now):

    WITH T AS (
        SELECT ID, MAX(Date) AS latest_date
        FROM yourTable
        GROUP BY ID
    )
    SELECT yourTable.*
    FROM yourTable
    JOIN T ON T.ID = yourTable.ID AND T.latest_date = yourTable.Date