某間隔時間的統計資料結果(例如每10分鐘或每小時),
如果只是單純對資料時間做分段進行統計那倒是很容易,
用DatePart以及DateAdd函式配合指定的時間間隔就可以輕鬆搞定。
不過,麻煩點在需求上原始資料時間中沒有的時間段一樣需要顯示,並且標示其值為0,
所以只單純針對原始資料進行時間分段似乎不夠,
第一個想法就是將該原始資料最小與最大時間段的時間依指定的間隔,
建立一個時間表,然後跟原始資料做JOIN,
這樣原始資料沒有紀錄的時間段自然就可以補0,
問題來了,這時間表要怎建.....
先跑個loop然後把查詢時間範圍內的時間依間隔作時間分割建成表,
雖然這樣好像可以,但總覺得有點搞工,應該有更好的解決方式....
向google大神討教一番後,
看到有人透過系統資料表spt_values方式去建立相關需要連續常數的資料,
一開始就覺得此方法可行,並測試了一下確定可以,不過後來看到了這系列文章
Generate a set or sequence without loops
以及這篇文章
Why should I consider using an auxiliary numbers table?
最後決定放棄使用spt_values, 採用直接建立一個Number table再進一步產生時間表,
Number table建立方式其實就只是一個表內存著N長度的連續整數,EX:
SELECT TOP 10 [Number] FROM [dbo].[Numbers] Number ----------- 0 1 2 3 4 5 6 7 8 9 (10 個資料列受到影響)然後透過這個Number Table就能產生出指定時間範圍內一定時間間隔的時間表了,
EX:2015-09-23 18:00:00~21:00:00 每10分鐘一個間距
select convert(varchar(16),dateadd(minute,number*10,'2015-09-23 18:00:00'),120) as [m_time] from [dbo].[Numbers] where convert(varchar(16),dateadd(minute,number*10,'2015-09-23 18:00:00'),120)< '2015-09-23 21:00:00' m_time ---------------- 2015-09-23 18:00 2015-09-23 18:10 2015-09-23 18:20 2015-09-23 18:30 2015-09-23 18:40 2015-09-23 18:50 2015-09-23 19:00 2015-09-23 19:10 2015-09-23 19:20 2015-09-23 19:30 2015-09-23 19:40 2015-09-23 19:50 2015-09-23 20:00 2015-09-23 20:10 2015-09-23 20:20 2015-09-23 20:30 2015-09-23 20:40 2015-09-23 20:50 2015-09-23 21:00 (19 個資料列受到影響)
沒有留言:
張貼留言