2014-09-23 65 views
1

我在那裏我們的產品會記錄其活動記錄表。該產品每天23:00開始工作,通常工作一兩個小時。這意味着,一批從23:00開始,大約在第二天凌晨1點結束。GROUP BY幾個小時

現在,我需要承擔多少職位每批登記的統計數據,但不能想出一個劇本,讓我achiving這一點。到目前爲止,我下面的SQL代碼:

SELECT COUNT(*), DATEPART(DAY,registrationtime),DATEPART(HOUR,registrationtime) 
FROM RegistrationMessageLogEntry 
WHERE registrationtime > '2014-09-01 20:00' 
GROUP BY DATEPART(DAY, registrationtime), DATEPART(HOUR,registrationtime) 
ORDER BY DATEPART(DAY, registrationtime), DATEPART(HOUR,registrationtime) 

這將導致以下

count day hour 
.... 
1189 9 23 
8611 10 0 
2754 10 23 
6462 11 0 
1885 11 23 

即我希望9號23:00的號碼與10號00:00號,10號23:00號和11號00:00號的號碼組合,依此類推。我怎麼能這樣做?

回答

2

你可以做到這一點很容易。使用DATEADD爲原始registrationtime添加一小時。如果你這樣做,所有的registrationtimes將被移動到同一天,你可以簡單地按日期分組。

你也能做到這一點,使用CASE WHEN更復雜的方式,但它是矯枉過正在這個簡單的解決方案的看法。

0

我不得不做類似的事情,前幾天。我有固定的工作班次時間分組,其中一人可以在晚上10點的某一天開始,第二天早上6點結束。

我所做的是:

  1. 定義「移日」,這是簡單地用零時間戳的一天,當換擋開始爲表中的每個條目。我能夠通過檢查輸入的時間戳是在凌晨0點到早上6點之間這樣做。在這種情況下,我只拿到了這個DATEADD(dd, -1, entryDate)的日期,這個日期在凌晨0點到早上6點之間返回了前一天的所有參賽作品。
  2. 我還爲班次添加了一個ID。第一個(上午6點到下午2點)爲0,第二個(下午2點到10點)爲1,最後一個(晚上10點到上午6點)爲3。
  3. 我當時能集團在轉變日期和轉移的ID。

實施例:

考慮以下源輸入:

Timestamp   SomeData 
============================= 
2014-09-01 06:01:00 5 
2014-09-01 14:01:00 6 
2014-09-02 02:00:00 7 

步驟一延長該表如下:

Timestamp   SomeData ShiftDay 
==================================================== 
2014-09-01 06:01:00 5   2014-09-01 00:00:00 
2014-09-01 14:01:00 6   2014-09-01 00:00:00 
2014-09-02 02:00:00 7   2014-09-01 00:00:00 

第二步擴展表如下:

Timestamp   SomeData ShiftDay    ShiftID 
============================================================== 
2014-09-01 06:01:00 5   2014-09-01 00:00:00 0 
2014-09-01 14:01:00 6   2014-09-01 00:00:00 1 
2014-09-02 02:00:00 7   2014-09-01 00:00:00 2 
0

你可以寫一個CASE語句如下

CASE WHEN DATEPART(HOUR,registrationtime) = 23 
    THEN DATEPART(DAY,registrationtime)+1 
END, 
CASE WHEN DATEPART(HOUR,registrationtime) = 23 
    THEN 0 
END 
0

下面的查詢會給你你期待什麼..

;WITH CTE AS 
(
SELECT COUNT(*) Count, DATEPART(DAY,registrationtime) Day,DATEPART(HOUR,registrationtime) Hour, 
RANK() over (partition by DATEPART(HOUR,registrationtime) order by DATEPART(DAY,registrationtime),DATEPART(HOUR,registrationtime)) Batch_ID 
FROM RegistrationMessageLogEntry 
WHERE registrationtime > '2014-09-01 20:00' 
GROUP BY DATEPART(DAY, registrationtime), DATEPART(HOUR,registrationtime) 
) 
SELECT SUM(COUNT) Count,Batch_ID 
FROM CTE 
GROUP BY Batch_ID 
ORDER BY Batch_ID 
0

如果你一小時時間添加到registrationtime,你就可以按日期部分:

GROUP BY 
    CAST(DATEADD(HOUR, 1, registrationtime) AS date) 

如果起始小時必須在輸出準確地反映(如9, 2310, 23而不是10, 011, 0),你可以在SELECT子句中獲得它作爲MIN(registrationtime)

SELECT 
    count = COUNT(*), 
    day = DATEPART(DAY, MIN(registrationtime)), 
    hour = DATEPART(HOUR, MIN(registrationtime)) 

最後,如果你不知道,你可以通過它們的別名,在訂單編號列BY:

ORDER BY 
    day, 
    hour 

只是讓你不必重複表述。