sql查詢技巧,按時間分段進行分組,每半小時一組統計組內記錄數量


今天拿到一個查詢需求,需要統計某一天各個時間段內的記錄數量。

具體是統計某天9:00至22:00時間段,每半小時內訂單的數量,最后形成的數據形式如下:
時間段          訂單數
9:00~9:30 xx個
9:30~10:00 xx個
...
 
如果說是按每個小時來統計訂單數量,這個是比較簡單的,只要將訂單表中的OrderTime字段中的小時取出,然后根據每個小時的值進行group by就可以了。
select T.timehour,count(T.orderid) as number from
(
select o.orderid,datename(hh,o.ordertime) as timehour from orders as o 
where o.ordertime<'2013-10-20 22:00' and o.ordertime>'2013-10-20 9:00'
) as T
group by T.timehour
order by timehour asc
 
但是如果要實現上面的那種查詢就有點麻煩了。我想到的一種實現方案是:取出每個訂單的時間字段中的“小時和分鍾”,將這個時間轉換為距凌晨的分鍾數。如:9:00轉換后就是540,9:30轉換后就是570。
計算的過程是:
1、取定一個基線值:base=540(9:00)
2、每條條訂單記錄的分鍾數設為:timehour
   分組編號:groupid=(timehour-base)/30
 
這樣可以將各個時間段內的時間統一到一個分組編號中去。如下:
時間值 groupid     
9:02     0
9:23 0
9:30 1
9:31 1
10:01 3
..
 
這樣一來,就把各個時間段內的時間轉換成對應的某一個分組編號了,這樣我們就可以對每個groupid進行分統計每個組內的訂單數了。
時間段          groupid
9:00~9:30 0
9:30~10:00 1
10:00~10:30 2
..
 
下面是完整的sql語句:
select T.groupid,count(T.orderid) as number from
(
select o.orderid,o.ordertime,((datename(hh,o.ordertime)*60+datename(mi,o.ordertime))-540)/30 as groupid from orders as o 
where o.ordertime<'2013-10-20 22:00' and o.ordertime>'2013-10-20 9:00'
) as T
group by T.groupid
order by groupid
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM