2009-10-05 4 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