2012-07-20 63 views
1

立即免責聲明:它以來我認真做了SQL,最近回到了幾年。GROUPBY訂購和單列選擇

給定一個表:

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)我想獲得權威的節點的最後一個狀態記錄(單行向以粗體突出),在權威的節點是最最近一個進入'開始',在沒有任何節點進入開始階段的情況下,它只是最近記錄的節點。

我想我的(而不是過濾器)布爾(狀態=「開始),TIME_STAMP遞減做某種形式的GROUP BY NODE_ID 命令,但我似乎無法獲得這項權利,除了我覺得GROUP BY必須在訂購後才能提供。

進出口使用的Postgres的9.x

回答

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 
+0

將需要檢驗,但假設這種設置,我可以用u.logical_id更換魔術1的做了一組,看起來很有希望會回報 – 2012-07-20 13:18:57

1

沒關係,一次犯規需要GROUPBY,而不是ORDER BY(狀態= '開始')遞減,TIME_STAMP DESC LIMIT 1似乎這樣的伎倆只有一條記錄。最後,我選擇Holger提供的一套最佳工作答案