1
我有一個表格,其中包含從特定設備接收到的每個數據包的條目。該表具有帶時間戳(時鐘滴答)的一列,每半小時接收一次數據包。 我想統計丟失的數據包。用時間戳記數據丟失的數據包diff
我的做法是計算每個連續行的時間戳的差異,如果差異大於40分鐘,則遞增計數器。
但我不知道如何用sql查詢來做到這一點。
我正在使用MS Reporting Services 2008 R2來顯示丟失數據包的計數。
我有一個表格,其中包含從特定設備接收到的每個數據包的條目。該表具有帶時間戳(時鐘滴答)的一列,每半小時接收一次數據包。 我想統計丟失的數據包。用時間戳記數據丟失的數據包diff
我的做法是計算每個連續行的時間戳的差異,如果差異大於40分鐘,則遞增計數器。
但我不知道如何用sql查詢來做到這一點。
我正在使用MS Reporting Services 2008 R2來顯示丟失數據包的計數。
我們不知道很多關於你的數據,但表示該表是這樣的:
create table ClockTick
(
packetTime datetime
)
insert into ClockTick select '01-Jan-2014 12:00'
insert into ClockTick select '01-Jan-2014 12:30'
insert into ClockTick select '01-Jan-2014 13:00'
insert into ClockTick select '01-Jan-2014 14:00'
insert into ClockTick select '01-Jan-2014 14:30'
insert into ClockTick select '01-Jan-2014 15:30'
insert into ClockTick select '01-Jan-2014 16:00'
insert into ClockTick select '01-Jan-2014 17:00'
可以得到所需要的結果,即,與像查詢:
with ticks as
(
select gapCounter = case
when datediff(minute, t.packetTime, g.packetTime) >= 40 then 1
else 0
end
from ClockTick t
cross apply (select top 1 g.packetTime
from ClockTick g
where t.packetTime < g.packetTime
order by g.packetTime) g
)
select lostPackets = sum(gapCounter)
from ticks
對於每一行,這是找到下一個接收到的數據包,然後將其添加到總數,如果差距> 40分鐘。
顯然你需要調整你的表/列。如果這沒有幫助,則需要提供一些示例數據和預期結果。
謝謝!這真的很有幫助。該表有一列名爲「時間戳」,是一個64位整數字段。該值從System :: DateTime對象中獲取,並調用方法Ticks(http://msdn.microsoft.com/zh-cn/library/system.datetime.ticks(v=vs.90).aspx?cs-保存琅= 1&CS琅= CPP#代碼片斷-1)。 我想我必須將int ticks轉換爲datetime,所以我可以像你一樣使用datediff。 –
不客氣!您可以將查詢調整爲'... when g。[timestamp] - t。[timestamp]> = 24000000000 then 1 else 0 ...',即24000000000個滴答的差值爲40分鐘(我認爲;算術可能是錯誤的),如果你不想在你的桌子上玩耍。 –
我做到了!非常感謝! –