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)
但我希望获得所有标识符的最新值.我怎样才能做到这一点?
最简单(也常常是最快)的方式是DISTINCT ONPostgres:
SELECT DISTINCT ON (identifier) *
FROM tbl
ORDER BY identifier, tstamp DESC;
Run Code Online (Sandbox Code Playgroud)
这也返回一个有序列表.
SQLFiddle.
详细信息:
选择每个GROUP BY组中的第一行?
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)
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |