Search code examples
mysqlsqlgreatest-n-per-group

Get most recent row for given ID


In the table below, how do I get just the most recent row with id=1 based on the signin column, and not all 3 rows?

+----+---------------------+---------+
| id | signin              | signout |
+----+---------------------+---------+
|  1 | 2011-12-12 09:27:24 | NULL    |
|  1 | 2011-12-13 09:27:31 | NULL    |
|  1 | 2011-12-14 09:27:34 | NULL    |
|  2 | 2011-12-14 09:28:21 | NULL    |
+----+---------------------+---------+

Solution

  • Use the aggregate MAX(signin) grouped by id. This will list the most recent signin for each id.

    SELECT 
     id, 
     MAX(signin) AS most_recent_signin
    FROM tbl
    GROUP BY id
    

    To get the whole single record, perform an INNER JOIN against a subquery which returns only the MAX(signin) per id.

    SELECT 
      tbl.id,
      signin,
      signout
    FROM tbl
      INNER JOIN (
        SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id
      ) ms ON tbl.id = ms.id AND signin = maxsign
    WHERE tbl.id=1