Snowflake - SQL 查询 - 登录注销 - 总工作时间

问题描述 投票:0回答:1

我正在尝试在 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

完全不知道如何解决这个问题。

数据格式

enter image description here

sql
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.