我正在尝试在 Snowflake 中编写一个 SQL 查询,该查询将为每个用户每天提供一行有关每个用户当天工作总小时数的信息。用户可以每周多天登录和注销。每个“事件”按行记录并根据以下格式存储在表中。
我正在尝试计算登录和注销之间的工作时间以及总工作时间(登录之间),并将它们收集在每个用户每天的单行中。非常感谢任何帮助。
数据格式:
resourcename EventDateTime AgentState EventDateTimeInSeconds
Chris Medina 5/6/24 5:59 AM Logged In 21560
Chris Medina 5/6/24 2:34 PM Logged Out 52477
Chris Medina 5/6/24 5:35 PM Logged In 52539
Chris Medina 5/6/24 8:36 PM Logged Out 52581
Christie Willis 5/6/24 6:59 AM Logged In 25184
Christie Willis 5/6/24 11:00 AM Logged Out 39618
Christie Willis 5/6/24 4:00 PM Logged In 57610
Christie Willis 5/6/24 8:03 PM Logged Out 72198
完全不知道如何解决这个问题。
数据格式
WITH EventPairs AS (
SELECT
resourcename,
EventDateTime,
AgentState,
LAG(EventDateTime) OVER (PARTITION BY resourcename, CAST(EventDateTime AS DATE) ORDER BY EventDateTime) AS PreviousEventDateTime,
LAG(AgentState) OVER (PARTITION BY resourcename, CAST(EventDateTime AS DATE) ORDER BY EventDateTime) AS PreviousAgentState
FROM
your_table_name
),
WorkIntervals AS (
SELECT
resourcename,
CAST(EventDateTime AS DATE) AS WorkDate,
DATEDIFF('second', PreviousEventDateTime, EventDateTime) / 3600.0 AS HoursWorked
FROM
EventPairs
WHERE
AgentState = 'Logged Out' AND PreviousAgentState = 'Logged In'
)
SELECT
resourcename,
WorkDate,
SUM(HoursWorked) AS TotalHoursWorked
FROM
WorkIntervals
GROUP BY
resourcename,
WorkDate
ORDER BY
resourcename,
WorkDate;
查询的结果将是一个表格,显示每个用户每天的总工作时间。对于提供的数据集,它看起来像这样:
resourcename WorkDate TotalHoursWorked
Chris Medina 2024-05-06 10.12
Christie Willis 2024-05-06 8.77