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 Réponses :
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;
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)
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)
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?