2009-10-05 118 views
0

我有一个表格,当插入这些数据时,该表格包含(除了所有其他数据)信息。现在我想知道插入的频率(插入每小时(或每15分钟)的数量)。以下是代码,我想要实现的。请注意,我也想显示没有发生插入的时间间隔(在我的例子中从10:00到11:00)。插入的频率

if object_id('tempdb..#temp') is not null drop table #temp 
create table #temp (Id int identity(1,1), Date datetime) 

insert into #temp (Date) 
select '2009-10-05 08:01:00' union all 
select '2009-10-05 08:22:00' union all 
select '2009-10-05 08:23:00' union all 
select '2009-10-05 08:24:00' union all 
select '2009-10-05 09:30:00' union all 
select '2009-10-05 11:01:00' union all 
select '2009-10-05 11:05:00' union all 
select '2009-10-05 11:52:00' union all 
select '2009-10-05 12:01:00' union all 
select '2009-10-05 12:05:00' union all 
select '2009-10-05 12:07:00' union all 
select '2009-10-05 12:09:00' union all 
select '2009-10-05 12:20:00' union all 
select '2009-10-05 12:30:00' union all 
select '2009-10-05 12:40:00' union all 
select '2009-10-05 12:50:00' union all 
select '2009-10-05 12:55:00' union all 
select '2009-10-05 13:30:00' union all 
select '2009-10-05 13:35:00' union all 
select '2009-10-05 13:40:00' union all 
select '2009-10-05 14:01:00' 

-- I want to get this data 
select '08:00 - 09:00', 4 union all 
select '09:00 - 10:00', 1 union all 
select '10:00 - 11:00', 0 union all 
select '11:00 - 12:00', 3 union all 
select '12:00 - 13:00', 9 union all 
select '13:00 - 14:00', 3 union all 
select '14:00 - 15:00', 1 

回答

1

这应该这样做。递归CTE用于构建飞行时间列表:

;WITH rangeCTE 
AS 
(
     SELECT MIN(DATE) minDate 
       ,MAX(DATE) maxDate 
     FROM #temp 
) 
,timeListCTE 
AS 
(
     SELECT CAST(CONVERT(CHAR(14),minDate,121) + '00:00' AS DATETIME) AS timeStart 
       ,DATEADD(hh,1,CAST(CONVERT(CHAR(14),minDate,121) + '00:00' AS DATETIME)) AS timeEnd 
       ,1 AS timeID 
     FROM rangeCTE 

     UNION ALL 

     SELECT DATEADD(hh,1,timeStart) 
       ,DATEADD(hh,2,timeStart) 
       ,timeID + 1 
     FROM timeListCTE 
     WHERE timeStart <= (SELECT maxDate FROM rangeCTE) 
) 
SELECT tl.timeStart 
     ,tl.timeEnd 
     ,SUM(CASE WHEN t.Date IS NOT NULL 
        THEN 1 
        ELSE 0 
      END 
      ) 
FROM  timeListCTE  AS tl 
LEFT JOIN #temp    AS t 
ON  t.DATE >= tl.timeStart 
AND  t.DATE < tl.timeEnd 
GROUP BY tl.timeStart 
     ,tl.timeEnd