SQL聚合时间序列表(HourOfDay,Val)到按工作日划分的HourOfDay的平均值(周一10:00-11:00



到目前为止,我做了一个SQL查询,它为我提供了一个表,其中包含一天中每小时处理的客户数量——给定任意的开始和结束日期时间值(来自Grafana接口(。结果可能会持续数周。我的目标是在工作日实现一个每小时的热图和平均值。

如何按小时汇总这些客户,以显示每个工作日该小时的平均值?

假设我在19天内每天得到24个值。我如何聚合,以便获得每个mon、tue、wed、thu、fri、sat、sun的24个值——每个小时代表这些天的平均值?

此外,只使用完整周的数据,因此去掉前导日和尾随日,这些数据不是完整周的一部分(因此,相同数量的单个工作日代表平均值(。

下面是一个片段,介绍到目前为止我的SQL查询的返回情况。(每天的小时数、客户数量(:

...    
2021-12-13 11:00:00 |   0
2021-12-13 12:00:00 |   3
2021-12-13 13:00:00 |   4
2021-12-13 14:00:00 |   4
2021-12-13 15:00:00 |   7
2021-12-13 16:00:00 |   17
2021-12-13 17:00:00 |   12
2021-12-13 18:00:00 |   18
2021-12-13 19:00:00 |   15
2021-12-13 20:00:00 |   8
2021-12-13 21:00:00 |   10
2021-12-13 22:00:00 |   1
2021-12-13 23:00:00 |   0
2021-12-14 00:00:00 |   0
2021-12-14 01:00:00 |   0
2021-12-14 02:00:00 |   0
2021-12-14 03:00:00 |   0
2021-12-14 04:00:00 |   0
2021-12-14 05:00:00 |   0
2021-12-14 06:00:00 |   0
2021-12-14 07:00:00 |   0
2021-12-14 08:00:00 |   0
2021-12-14 09:00:00 |   0
2021-12-14 10:00:00 |   12
2021-12-14 11:00:00 |   12
2021-12-14 12:00:00 |   19
2021-12-14 13:00:00 |   11
2021-12-14 14:00:00 |   11
2021-12-14 15:00:00 |   12
2021-12-14 16:00:00 |   9
2021-12-14 17:00:00 |   2
...

因此(示意性地,示例数据(startDate 2021-12-10 11:00 to endDate 2021-12-31 17:00

-------------------------------
...
Mon 2021-12-13 12:00  | 3
Mon 2021-12-13 13:00  | 4
Mon 2021-12-13 14:00  | 4
...
Mon 2021-12-20 12:00  | 1
Mon 2021-12-20 13:00  | 6
Mon 2021-12-20 13:00  | 2
...
Mon 2021-12-27 12:00  | 2
Mon 2021-12-27 13:00  | 2
Mon 2021-12-27 13:00  | 3
...
-------------------------------

以下内容:脱衣舞领军周五上午10点,周六上午11点,周日上午12点。带钢拖尾图28,文29,图30,周五31。每个工作日的平均小时数

-------------------------------
...
Mon 12:00  | 2
Mon 13:00  | 4
Mon 14:00  | 3
...
Tue 12:00  | x
Tue 13:00  | y
Tue 13:00  | z
...
-------------------------------

到目前为止我的方法:

WITH CustomersPerHour as (
SELECT dateadd(hour, datediff(hour, 0, Systemdatum),0) as DayHour, Count(*) as C 
FROM CustomerList
WHERE CustomerID > 0
AND Datum BETWEEN '2021-12-010T11:00:00Z' AND '2021-12-31T17:00:00Z'
AND EntryID IN (62,65)
AND CustomerID IN (SELECT * FROM udf_getActiveUsers())
GROUP BY dateadd(hour, datediff(hour, 0, Systemdatum), 0)
)

-- add null values on missing data/insert missing hours
SELECT DATEDIFF(second, '1970-01-01', dt.Date) AS time, C as Customers
FROM dbo.udf_generateHoursTable('2021-12-03T18:14:56Z', '2022-03-13T18:14:56Z') as dt
LEFT JOIN CustomersPerHour cPh ON dt.Date = cPh.DayHour
ORDER BY
time ASC

Hi最简单的解决方案就是按照您在示例中所写的操作。为聚合创建自定义基础。

所以第一步是用Date&小时精度&客户数量。

然后创建基础。这是基本思想的例子:

-- EXAMPLE
SELECT 
DATENAME(WEEKDAY, GETDATE()) + ' ' + CAST(DATEPART(HOUR, GETDATE()) + ':00' AS varchar(8)) 
-- OUTPUT: Sunday 21:00

您可以连接数据,然后在GROUP BY子句中使用它。根据您的用例调整此查询:

SELECT 
DATENAME(WEEKDAY, <DATETIME_COL>) + ' ' + CAST(DATEPART(HOUR, <DATETIME_COL>) AS varchar(8)) + ':00' as base
,SUM(...) as sum_of_whatever
,AVG(...) as avg_of_whatever
FROM  <YOUR_AGG_TABLE>
GROUP BY DATENAME(WEEKDAY, <DATETIME_COL>) + ' ' + CAST(DATEPART(HOUR, <DATETIME_COL>) AS varchar(8)) + ':00'

这样可以完全按照您的意愿创建基础。您可以使用此逻辑来创建其他所需的agg。基地。

最新更新