2012-09-27 101 views
0

SQL Server 2008的SQL Server分解日期時間的日 - 小時查詢?

declare @pardate table (pardateid int, pardatewhen datetime2(3)) 
insert into @pardate values (1 , '2011-09-17 12:43') 
insert into @pardate values (2 , '2011-09-17 12:44') 
insert into @pardate values (3 , '2011-10-11 12:45') 
insert into @pardate values (4 , '2011-10-12 12:46') 
insert into @pardate values (5 , '2011-10-13 12:47') 
insert into @pardate values (6 , '2011-11-20 12:48') 
insert into @pardate values (7 , '2011-11-21 12:49') 
insert into @pardate values (8 , '2011-11-22 12:50') 
declare @child table (childid int , pardateid int , childvalue char(6)) 
insert into @child values (1 , 1 , 'aaaaaa') 
insert into @child values (2 , 2 , 'bbbbbb') 
insert into @child values (3 , 3 , 'cccccc') 
insert into @child values (4 , 4 , 'dddddd') 
insert into @child values (5 , 5 , 'cccccc') 
insert into @child values (6 , 6 , 'cccccc') 
insert into @child values (7 , 7 , 'eeeeee') 
insert into @child values (8 , 8 , 'ffffff') 

select pardatewhen , childvalue , COUNT(childvalue) 
from @child childtable join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
group by pardatewhen , childvalue 

我試圖讓child.childvalue每一天每一個小時的@計數,所以就在我結果8760行。 第一遍有一個循環和一個CONVERT,它需要大約5分鐘才能運行實際的結果集(這只是插圖的一個示例)。我確實創建了一個CTE來製作一個日曆臨時表(使用http://www.sqlpointers.com/2006/07/generating-temporary-calendar-tables.html),並且認爲它可以以某種方式加入「空值」到結果集中。

我需要得到一個結果集,看起來像這樣

date   hour count 
... 
2011-09-17 0  0 
.... 
2011-09-17 12  2 
.... 
2011-10-11 12  1 

那怎麼可以高效地完成?

謝謝。

回答

1

嘗試。

;WITH cal AS 
(SELECT CAST('2011-01-01' AS DATETIME) AS cal_date 
    UNION ALL 
SELECT DATEADD(hour,1,cal_date) 
    FROM cal 
    WHERE cal_date < '2011-12-31 23:00' 
) 
, par AS 
(
    select CAST(pardatewhen AS DATE) AS pardate, DATEPART(hh,pardatewhen) AS parhour , COUNT(childvalue) as num 
    from @child childtable 
    join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
    group by CAST(pardatewhen AS DATE), DATEPART(hh,pardatewhen) 
) 
SELECT CAST(cal.cal_date AS DATE) AS [date],DATEPART(hh,cal.cal_date) AS [hour],ISNULL(par.num,0) AS [childvalue_count] 
FROM cal 
LEFT JOIN par 
    ON CAST(cal.cal_date AS DATE) = par.pardate 
     AND DATEPART(hh,cal.cal_date) = par.parhour 
OPTION (MAXRECURSION 9999) 
+0

@Snowy - 如果你需要處理超過9999小時設置'MAXRECURSION'爲'0'消除遞歸的限制。 – HABO

1

喜歡的東西(有childvalue在你的查詢,但不是在你的榜樣結果呢?)

select Cast(pardatewhen as Date) as [date], DatePart(hour,pardatewhen) as [hour] , childvalue , COUNT(childvalue) 
from @child childtable 
join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
group by Cast(pardatewhen as Date), DatePart(hour,pardatewhen), childvalue 

註記日期類型是SQL推出2008

+2

該OP要求計算「每天,每小時,所以在我的結果中會有8760行」。可能需要生成所有日期/小時的CTE。 – HABO

+0

啊我錯過了。看起來像EricZ那裏雖然 –