Количество групп за каждый час на столе - PullRequest
0 голосов
/ 14 января 2019

Мне нужно посчитать количество заявок в таблице за последние N дней на каждый час. Я использую SQL Server 2014. Что-то вроде:

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

Есть ли способ автоматизировать получение результата, например:

дата | сроки | подсчитывать

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Это сделает работу

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 голосов
/ 14 января 2019

Вы можете попытаться извлечь час с помощью datepart и сгруппировать его следующим образом.

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 голосов
/ 14 января 2019

Это что-то вроде удара в темноте, однако, общий способ добиться этого - использовать таблицу подсчета для создания всех необходимых вам приращений даты. Это должно привести вас на правильный путь. Если вы не понимаете, пожалуйста, спросите.

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;
...