2017-08-21 9 views
0

存在しない場合、私はこのようになり約100万のエントリを持つテーブルがあります:私はのTagNameがアラームで最長となっていた把握する必要がありますが、私ドンSQL SELECT行別に

TimeStamp     TagName  Alarm Status 
2017-08-02 10:53:10.000  XS-101  Alarm 
2017-08-02 18:49:45.000  XS-201  Alarm 
2017-08-03 01:08:16.000  XS-101  Normal 
2017-08-05 09:16:42.000  XS-301  Alarm 
2017-08-12 12:33:39.000  XS-101  Alarm 

をもしそれが現在警戒していなければ気にしないでください。私はプログラムコードでこれを行うことができますが、私のプログラムの他のすべてのSQLクエリは、私が必要とするものを正確に返します。 SQLだけでこれを行うことは可能ですか?

私は人が他の行の内容に基づいて行を返す例を検索しましたが、私は運が全くありませんでした。

+0

こんにちは@ケン、あなたはあなたの試みたSQL構文はありますか?おそらくあなたが欠けているのはちょっとした微調整です。これは単純なMAX(タイムスタンプ)GROUP BY [Alarm Status]クエリです。 MAX関数を検索しようとしましたか? – Isaiah3015

+0

ご使用のデータベースで質問にタグを付けてください。 –

+0

@ Isaiah3015私はしましたが、私は現在どのようにアラームに入っていないタグを除外するのか分かりませんでした。 – Ken

答えて

1

どのタグがアラーム状態になっているかは、最も古い現在のアラームコードを持つタグを尋ねています。あなたは条件付き集計でこれを行うことができ

select tagname, max(timestamp) 
from t 
group by tagname 
having max(timestamp) = max(case when status = 'Alarm' then timestamp end) 
order by max(timestamp) asc; 

これは、2つのアラームが同じタグの順序ではないことを前提として - これはあなたの記述されたデータと一致しています。

+0

ゴードンさん、ありがとうございました。私はそれについて知らなかった。しかし、どのようにあなたは正常な条件を扱いますか?タグの最後のイベントがノーマルだった場合、それは現在アラームではなく、最終結果になる必要はありません。ノーマルで同じクエリを再度実行し、タグ名にそれらを結合してから、最新のタイムスタンプを持つものを選択しますか? – Ken

+0

@Ken。 。 。これは法線を扱います。最新のタイムスタンプが「 'Alarm'」のタグのみが結果セットに含まれます。 –

+0

あなたはそうです。あなたの例は、サンプルデータで完全に動作します。でも、私はテーブルに肯定応答のイベントがあるのを忘れていました。あなたのコードを理解しようとすると、それは私を捨てました。ソリューションを実行する前にそれらのイベントをフィルタリングすると、私が期待した結果が得られます。助けてくれてありがとう。 – Ken