Sql 分组排序和单行选择

Sql 分组排序和单行选择,sql,postgresql,Sql,Postgresql,即时免责声明:我已经几年没有认真使用SQL了,最近才回来 给出一张表格: logical_id, instance_id, node_id, state, time_stamp 1, 1, a, starting, 1300003234 2, 1, a, up, 1300003235 **3, 1, b, starting, 1300003237** 4, 1, a, completed, 1300003239 5, 1, a, shutdown, 1300003240 给定一个特定的实例id

即时免责声明:我已经几年没有认真使用SQL了,最近才回来

给出一张表格:

logical_id, instance_id, node_id, state, time_stamp
1, 1, a, starting, 1300003234
2, 1, a, up, 1300003235
**3, 1, b, starting, 1300003237**
4, 1, a, completed, 1300003239
5, 1, a, shutdown, 1300003240
给定一个特定的实例id(例如1),我希望获得创作节点的最后一个状态记录(单行-以粗体突出显示),创作节点是最近一个输入“启动”的节点,如果没有任何节点进入启动阶段,它只是要记录的最新节点

我想我用order by(而不是filter)布尔值(state='starting),time_stamp desc来做一些表单group by node_id,但我似乎不能正确地实现这一点,此外,我认为group by必须在排序之后出现


我使用postgres 9.x

无需担心,一旦不需要groupby,而是ORDER BY(state='starting')desc,时间戳desc LIMIT 1似乎只对一条记录起作用。最后我选择了一个答案,这个答案在Holger的集合上最有效。

这将检索最新的stating节点,如果它存在的话,否则,它将只返回最近的非启动节点

SELECT U.logical_id, U.instance_id, U.node_id, U.state, U.time_stamp
FROM 
(
 SELECT M1.logical_id, M1.instance_id, M1.node_id, M1.state, M1.time_stamp, 1 AS node_type
 FROM MyTable M1
 WHERE M1.instance_id=1 AND M1.state='starting' 
 ORDER BY M1.time_stamp DESC LIMIT 1

 UNION

 SELECT M2.logical_id, M2.instance_id, M2.node_id, M2.state, M2.time_stamp, 0 AS node_type
 FROM MyTable M2
 WHERE M2.instance_id=1 
 ORDER BY M2.time_stamp DESC LIMIT 1
) AS U
ORDER BY U.node_type DESC  LIMIT 1

从表中选择*,其中instance_id=1,time_stamp=max(time_stamp),state='starting'

你试过这条路线吗?当到达时间戳的根时,时间戳或间隔很长。这可能会有所帮助,因为约会是人们永远不应该记住的事情之一


将需要测试,但假定此设置我可以通过使用u.logical_id替换magic 1来完成这项工作,我将报告