2017-05-05 92 views
0

我有一個大型數據集,我需要爲每個可用的time_stamp選擇特定的標籤,但是如果給定標籤存在多個time_stamps,我需要選擇一個加上最新的加載時間戳。帶查詢語句和最新加載時間的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,我有多個標籤結果/值。我的需求是,我只爲每個tag/time_stamp擁有一個值,並且它是具有最新loadtimestamp的值。

我已經看到試圖拉取最新日期的幾個版本的查詢,但我找不到一種方法來應用它,同時也使用case語句。

我試過幾個版本的子查詢,但我相信結果是每個時標籤被發現,其查詢的整個數據集尋找同樣的標籤和TIME_STAMP,然後選擇一個與最新loadtimestamp。由於我的數據集大約是5000萬行,而我的結果表應該是大約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;