2015-04-07 239 views
1

我想要在MS SQL Server Management Studio中精簡一個大型表。目前每5秒鐘有一行數據。我想縮小表格,每30分鐘只保存一行。SQL:按日期時間過濾數據

,而不是在

Timestamp   A B C 
    2015-01-01 00:00:00 1 5 6 
    2015-01-01 00:00:05 5 7 1 
    2015-01-01 00:00:10 2 2 3 
    2015-01-01 00:00:15 2 1 0 
    ...... 
    2015-04-10 13:55:55 4 5 6 
    2015-04-10 13:56:00 6 4 2 

我想有成千上萬行的薄出來。例如,所以我只有

Timestamp   A B C 
    2015-01-01 00:00:00 1 5 6 
    2015-01-01 00:30:00 2 5 7 
    2015-01-01 01:00:00 1 7 6 
    ...... 
    2015-04-10 13:30:00 4 5 6 
    2015-04-10 14:00:00 6 4 2 

謝謝!

+0

爲了澄清,你想讓它每隔30秒拍攝,還是應該行包含的所有數據,因爲以前的30秒?也就是說,是否要刪除時間戳不是30秒間隔的所有行,或者是否要爲每個間隔對數據進行求和(我猜計數)? – APH

+0

感謝您的澄清!我只想每隔30分鐘拍一張快照,這樣其餘的數據就不需要了,可以刪除。 – fondue222

+0

最後一位數字(在秒數上)始終爲0或5,還是可能在一小時後有3秒的數據? –

回答

3

鑑於你的樣本數據,你可以這樣做:

select t.* 
from table t 
where datepart(minute, timestamp) in (0, 30) and 
     datepart(second, timestamp) = 0; 
+1

如果任務是精簡表,那麼'刪除從哪裏不是(datepart(second,timestamp)in(0,30)and datepart(second,timestamp)= 0);' –

+1

每個好的delete語句都應該啓動作爲選擇語句關閉。 –

+0

謝謝!這工作完美! – fondue222

0

delete from [massive Table] where datepart(mi,timestamp) not in (0,30)

將刪除不符合您的條件的所有行。

0

如果你的時間不總是在0或5,你可以試試這個。

Delete 
From YourTable 
Where DateDiff(Second, '20000101', TimeStamp) % 1800 > 4 

這是通過計算已經從...過期1月1日,2000年Mod運算符是用來計算你想保持間隔秒數。 30分鐘內有1800秒。因此,秒數大於4的任何數據都應該被刪除。基本上,我們不是按照小時,分鐘和秒來考慮時間,而是按照1800秒的時間間隔思考時間,這正是您想要的。

0

從一組行中選擇一行時,編寫依賴於可能不正確的假設的代碼並不總是一個好主意。例如,當在小時和半小時查找第一個入口時,是否保證總會有時間戳「hh-00-00」和「hh-30-00」的入口?你的樣本數據顯示,但這樣做是否準確地代表你的實際數據?

你可能想說的是,你想保留「每小時和半小時後的第一個入口」。這樣,即使第一次輸入是在小時或半小時後的兩秒鐘內進入,您也知道每半小時會有一次輸入。

因此,第一步是將日期分爲半小時組。我發現做到這一點的最好辦法是

Convert(SmallDatetime, Floor(Cast(Timestamp AS float) * 48.0)/48.0) 

粘性上查詢列表的末尾,看看是否正確的時間(四捨五入精確的時間或正好在半小時)。特別注意與邊界非常接近的時間(之前和之後)。

使用該功能,可以輕鬆生成每半小時增量內首次發生的時間列表。您不必擔心每個增量具有與第二個半小時邊界相匹配的條目。加入,你會得到一個完整的行列表。刪除所有其餘的。

with 
Halfs(HalfHour)as(
    select Min(Timestamp) 
    from TData 
    group by Convert(SmallDatetime, Floor(Cast(Timestamp AS float) * 48.0)/48.0) 
) 
select t.* 
from TData t 
join Halfs h 
    on h.HalfHour = t.TimeStamp; 

http://sqlfiddle.com/#!6/65a5c/1/0