1

立即免责声明:我认真做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

给定一个特定的 instance_id(例如 1),我想获取权威节点的最后一个状态记录(单行 - 以粗体突出显示),权威节点是最近进入“开始”的节点,在没有任何节点进入起始阶段,它只是要记录的最新节点。

我想我用 node_id 做一些表单 group by (而不是 filter) boolean (state = 'starting), time_stamp desc,但我似乎无法做到这一点,此外我认为 group by 必须在订购。

我正在使用 postgres 9.x

4

3 回答 3

1

没关系,一旦不需要 groupby,而是 ORDER BY (state='starting') desc, time_stamp desc LIMIT 1 似乎只对单个记录有效。最后,我选择了在 Holger 的一组中最有效的答案

于 2012-07-20T12:58:52.837 回答
1

这将检索最近的声明节点(如果存在),否则它将简单地返回最近的非起始节点。

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
于 2012-07-20T13:03:37.840 回答
0

Select * from table where instance_id = 1 and time_stamp = max(time_stamp) and state = 'starting';

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

http://www.postgresql.org/docs/8.2/static/functions-datetime.html

于 2012-07-20T13:12:05.480 回答