2
votes

Compte de groupe pour chaque heure sur la table

Je dois compter le nombre de demandes dans le tableau au cours des N derniers jours toutes les heures. J'utilise SQL Server 2014. Quelque chose comme:

select count(*) from [BankLog].[ProcInst]
  where StartDate >= '2019-01-14 09:00:00' and FinishDate <='2019-01-14 10:00:00'

Existe-t-il un moyen d'automatiser pour obtenir des résultats comme:

date | calendrier | compter


3 commentaires

Créez une table / cte stockant tous les créneaux horaires d'une heure. JOINDRE.


quelles sont les colonnes de votre tableau?


Avez-vous des données pour toutes les heures que vous souhaitez? Ou voulez-vous des lignes avec des nombres de 0?


3 Réponses :


4
votes

C'est un peu un coup de couteau dans l'obscurité, cependant, une manière courante d'y parvenir est d'utiliser une table de pointage pour créer tous les incréments de date dont vous avez besoin. Cela devrait vous mettre sur la bonne voie. Si vous ne comprenez pas, veuillez demander.

USE Sandbox;
GO
DECLARE @StartDate datetime, @EndDate datetime;
SET @StartDate = '20190101';
SET @EndDate = '20190131';

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS I
    FROM N N1 --10
         CROSS JOIN N N2 --100
         CROSS JOIN N N3 --1000
         CROSS JOIN N N4 --10000 ≈ 1 Year
         CROSS JOIN N N5 --100000 ≈ 11 Years
         CROSS JOIN N N6 --1000000 ≈ 110 Years
    ),
Dates AS(
    SELECT DATEADD(HOUR, T.I, @StartDate) AS StartHour,
           DATEADD(HOUR, T.I+1, @StartDate) AS EndHour
    FROM Tally T
    WHERE DATEADD(HOUR, T.I, @StartDate) < DATEADD(DAY, 1, @EndDate))
SELECT CONVERT(date, StartHour) AS [Date],
       D.StartHour,
       D.EndHour,
       COUNT(BLPI.{Column}) AS [Count] --{Column} needs replacing.
FROM Dates D
     LEFT JOIN [BankLog].[ProcInst] BLPI ON BLPI.StartDate >= D.StartHour
                                        AND BLPI.StartDate < D.EndHour;


0 commentaires

4
votes

Cela fera le travail

SELECT CAST(StartDate as date) AS TheDate,
       DATEPART(hour,StartDate) AS TheHour,
       COUNT(*) AS Totals
FROM [BankLog].[ProcInst]
WHERE StartDate >= '2019-01-14 09:00:00' AND FinishDate <='2019-01-14 10:00:00'
GROUP BY CAST(StartDate as date),
       DATEPART(hour,StartDate)


0 commentaires

3
votes

Vous pouvez essayer d'extraire l'heure avec datepart et la regrouper comme ça.

SELECT CONVERT(VARCHAR(10), yourtable.date 111) AS date
,DATEPART(HH,yourtable.date) AS hour
,COUNT(*) AS count 

FROM yourtable

WHERE yourtable.date > '2019-01-13 09:00:00' 
AND yourtable.date <= '2019-01-14 10:00:00'

GROUP BY 
CONVERT(VARCHAR(10), yourtable.date 111)
,DATEPART(HH,yourtable.date)

ORDER BY 
DATEPART(HH,yourtable.date)


0 commentaires