仅为表中的每个标识符选择最新值

BLu*_*NiX 4 sql database postgresql select greatest-n-per-group

我有一个看起来像这样的表:

identifier | value | tstamp
-----------+-------+---------------------
abc        | 21    | 2014-01-05 05:24:31
xyz        | 16    | 2014-01-11 03:32:04
sdf        | 11    | 2014-02-06 07:04:24
qwe        | 24    | 2014-02-14 02:12:07
abc        | 23    | 2014-02-17 08:45:24
sdf        | 15    | 2014-03-21 11:23:17
xyz        | 19    | 2014-03-27 09:52:37
Run Code Online (Sandbox Code Playgroud)

我知道如何获得单个标识符的最新值:

select * from table where identifier = 'abc' order by tstamp desc limit 1;
Run Code Online (Sandbox Code Playgroud)

但我希望获得所有标识符的最新值.我怎样才能做到这一点?

Erw*_*ter 7

最简单(也常常是最快)的方式是DISTINCT ONPostgres:

SELECT DISTINCT ON (identifier) *
FROM   tbl
ORDER  BY identifier, tstamp DESC;
Run Code Online (Sandbox Code Playgroud)

这也返回一个有序列表.
SQLFiddle.
详细信息:
选择每个GROUP BY组中的第一行?

  • +1,我不知道postgres中的'DISTINCT ON()` (2认同)

Lam*_*mak 5

SELECT *
FROM (  SELECT  *,
                ROW_NUMBER() OVER(PARTITION BY identifier 
                                  ORDER BY tstamp DESC)  AS RN
        FROM YourTable) AS T
WHERE RN = 1
Run Code Online (Sandbox Code Playgroud)

这是一个带有这个演示的sqlfiddle.

结果是:

?????????????????????????????????????????????????????????????
? IDENTIFIER ? VALUE ?             TSTAMP              ? RN ?
?????????????????????????????????????????????????????????????
? abc        ?    23 ? February, 17 2014 08:45:24+0000 ?  1 ?
? qwe        ?    24 ? February, 14 2014 02:12:07+0000 ?  1 ?
? sdf        ?    15 ? March, 21 2014 11:23:17+0000    ?  1 ?
? xyz        ?    19 ? March, 27 2014 09:52:37+0000    ?  1 ?
?????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

  • @BLuFeNiX:一个好处是窗口函数适用于所有现代RDBMS(MySQL除外),而`DISTINCT ON`是标准SQL`DISTINCT`子句的Postgres特定扩展. (2认同)