2017-05-05 9 views
0

非常に使用可能なtime_stampごとに特定のタグを選択する必要がある大量のデータがありますが、特定のタグの複数のtime_stampが存在する場合は、最新のloadtimestampで更新します。最新のロード時間のケース・ステートメントを含むSQL問合せ

これは私のデータセットの簡易版である:

|tag_name | value |  time_stamp | loadtimestamp | 
|:---------:|:-------:|:-----------------:|:-----------------:| 
| TAG1 | 10 |2017-01-19 22:16:04|2017-01-19 22:49:58| 
| TAG2 | 89 |2017-01-19 22:16:04|2017-01-19 22:49:58| 
| TAG3 | 22 |2017-01-19 22:16:04|2017-01-19 22:49:58| 
| TAG1 | 12 |2017-01-19 22:17:05|2017-01-19 22:49:58| 
| TAG2 | 93 |2017-01-19 22:17:05|2017-01-19 22:49:58| 
| TAG3 | 15 |2017-01-19 22:17:05|2017-01-19 22:49:58| 
| TAG1 | 9  |2017-01-19 22:16:04|2017-01-22 12:29:12| 
| TAG2 | 88 |2017-01-19 22:16:04|2017-01-22 12:29:12| 
| TAG3 | 21 |2017-01-19 22:16:04|2017-01-22 12:29:12| 
| TAG1 | 15 |2017-01-19 22:18:05|2017-01-19 22:49:58| 
| TAG2 | 98 |2017-01-19 22:18:05|2017-01-19 22:49:58| 
| TAG3 | 23 |2017-01-19 22:18:05|2017-01-19 22:49:58| 

当初、私はloadtimestampの問題について考えていませんでしたし、次のように私のクエリはだった:

select time_stamp, 
MAX(Case when tag_name = 'TAG1' then value else NULL END) as "Tagname 1", 
MAX(Case when tag_name = 'TAG2' then value else NULL END) as "Tagname 2", 
MAX(Case when tag_name = 'TAG3' then value else NULL END) as "Tagname 3", 
from "DATATABLE".calculated_data 
group by time_stamp 

私はケースを使用私はデータセットの各タグに特定の名前を付ける方法が必要だったので、

結果は、22:16:04にタグに複数の結果/値があることでした。私が必要とするのは、各タグ/ time_stampに1つの値しかなく、最新のloadtimestampを持つタグ/タイムスタンプです。

最新の日付を取得しようとしているいくつかのバージョンのクエリがありますが、caseステートメントを使用している間にそれを適用する方法を見つけることができませんでした。

私は、サブクエリでいくつかのバージョンを試してみましたが、私は結果はタグが見つかった時間が、それは同じタグとTIME_STAMPを探しているデータセット全体を照会して、最新のloadtimestampで1を選択したことだったと思います。私のデータセットは約5千万行であり、得られたテーブルは約100万であるはずなので、この方法は実現可能ではありませんでした(正直言って本当にうまく動作することはありません)。私の最終的なアプローチは、の合理的な時間内に実行できるように、幾分最適化する必要があります。

私はSQLに非常に慣れていて、奥行きが少しありますので、これがあまりにも基本的であるか、おそらく明確でない場合はお詫び申し上げます。私はこの問題に関するどんな助けや方向性にも大いに感謝します。

ありがとうございます!

答えて

0
select t.tag_name ,t.time_stamp from 
(select tag_name ,time_stamp , 
row_number()over(partition by tag_name,time_stamp order by loadtimestamp 
desc) as RN 
from calculated_data)t 
where t.RN=1 
+0

そんなに感謝カピルあなたに! –

0

カピルの答えが素晴らしい。完全なクエリは〜3分かかりました。 case文で

は、それが最終的にこのように見えた:

select t.time_stamp, 
MAX(Case when tag_name = 'TAG1' then value else NULL END) as "Tagname 1", 
MAX(Case when tag_name = 'TAG2' then value else NULL END) as "Tagname 2", 
MAX(Case when tag_name = 'TAG3' then value else NULL END) as "Tagname 3", 
from 
(select time_stamp, tag_name value, 
row_number()over(partition by tag_name , time_stamp, value order by loadtimestamp 
desc) as RN 
from calculated_data) t 
where t.RN = 1 
group by t.time_stamp 
order by t.time_stamp; 
関連する問題