2009-10-05 5 views
0

J'ai une table, qui contient (en plus de toutes les autres données) des informations, quand ces données ont été insérées. Maintenant, je voudrais connaître la fréquence des inserts (nombre d'inserts par heure (ou par 15 minutes)). Ci-dessous le code, ce que je veux réaliser. Notez que je veux également montrer l'intervalle de temps où aucun inserts se sont produits (dans mon exemple de 10:00 à 11:00).Fréquence des insertions

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 

Répondre

1

Cela devrait le faire. Un CTE récursive est utilisé pour construire la liste des heures à la volée:

;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 
Questions connexes