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) が与えられた場合、権限のあるノードの最後の状態レコード (単一の行 - 太字で強調表示) を取得したい場合、権限のあるノードは、何も存在しない場合に「開始」に入った最新のノードです。開始段階に入るノードは、ログに記録される最新のノードだけです。

order by (フィルターではなく) boolean(state = 'starting), time_stamp desc を使用して node_id ごとに何らかのフォーム グループを作成することを考えましたが、これを正しく理解できないようです。注文。

Postgres 9.xを使用しています

4

3 に答える 3

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 に答える
1

一度は groupby を必要としないので、代わりに ORDER BY (state='starting') desc, time_stamp desc LIMIT 1 を使用すると、単一のレコードに対してのみトリックが実行されるようです。最後に、Holger のセットよりも最適な答えを選択します。

于 2012-07-20T12:58:52.837 に答える
0

instance_id=1およびtime_stamp=max(time_stamp)およびstate='starting'であるテーブルから*を選択します。

このルートを試しましたか?タイムスタンプまたはそのルートに到達するときの間隔が長い。日付を操作することは、誰かが決して覚えてはいけないことの1つであるため、これは役立つ場合があります

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

于 2012-07-20T13:12:05.480 に答える