SQL-聚合时间序列 Table (HourOfDay, Val) 到按工作日计算的 HourOfDay 的平均值(fi. Avg of Mondays 10:00-11:00, 11:00-12 :00,...,星期二...)

SQL-Aggregate Timeseries Table (HourOfDay, Val) to Average Value of HourOfDay by Weeekday (fi. Avg of Mondays 10:00-11:00, 11:00-12:00,...,Tue...)

到目前为止,我做了一个 SQL 查询,它为我提供了一个 table 包含一天中每个小时处理的客户数量 - 给定任意开始和结束日期时间值(从Grafana 界面)。结果可能会持续数周。我的目标是使用平均值在工作日实施每小时热图。

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

假设我在 19 天内每天获得 24 个值。我如何聚合以便为每个星期一、星期二、星期三、星期四、星期五、星期六、星期日获得 24 个值 - 每小时代表这些天的平均值?

也只使用整周的数据,所以去掉前导和尾随的日子,它们不是完整表示的一周的一部分(所以相同数量的个别工作日代表平均值)。

这是关于我的 SQL 查询的 return 到目前为止的样子的片段。 (每天的小时数,顾客数量):

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

所以(示意性地,示例数据)开始日期 2021-12-10 11:00 到结束日期 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

您好,最简单的解决方案就是执行您在示例中编写的内容。为聚合创建自定义基础。

因此,第一步是准备您的汇总数据 table,其中包含日期和时间精度以及客户数量。

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

-- 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'

这完全符合您的要求。 您可以使用此逻辑来创建其他所需的聚合。碱基。