如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?

Posted

技术标签:

【中文标题】如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?【英文标题】:How to calculate average time between entries grouped by date and user in SQL Server? 【发布时间】:2020-04-17 19:12:14 【问题描述】:

我的数据看起来像:

User   Start_Time             End_Time
-------------------------------------------------
A      2018-12-05 08:30:00    2018-12-05 09:45:00
B      2018-12-05 09:30:00    2018-12-05 10:00:00
B      2018-12-05 10:30:00    2018-12-05 10:45:00
A      2018-12-05 10:45:00    2018-12-05 11:45:00
A      2018-12-05 12:15:00    2018-12-05 12:30:00
A      2018-12-06 05:30:00    2018-12-05 06:45:00
B      2018-12-06 06:45:00    2018-12-05 07:45:00
B      2018-12-06 08:45:00    2018-12-05 09:30:00

我正在尝试计算一个条目的 End_Time 和下一个条目的 Start_time 之间的平均时间长度,按用户和日期分组。

从上面的示例中,输出应如下所示:

User  Date         Average Time Between Entries(in minutes)
------------------------------------------------------------
A     2018-12-05   45
B     2018-12-05   30
A     2018-12-06   Null
B     2018-12-06   60

是否有可以完成此任务的 SQL Server 查询?

【问题讨论】:

我们随时为您提供帮助。向我们展示您的尝试,我们会加入。 到目前为止你尝试了什么???如果没有,那就开始工作吧。 Is there a SQL Server query that could accomplish this?:是的。 虽然你的数据有错误(最后三行的结束日期错误),但我不明白为什么这会被否决。 【参考方案1】:

使用lead():

select t.user, convert(date, start_time),
       avg(datediff(minute, end_time, next_start_time))
from (select t.*,
             lead(start_time) over (partition by user, convert(date, start_time) order by start_time) as next_start_time
      from t
     ) t
group by user, convert(date, start_time);

Here 是一个 dbfiddle(数据固定,因此结束时间大于开始时间)。

【讨论】:

以上是关于如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL Server 在此查询中按天对结果进行分组?

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

如何在 Jooq 中按月和年将毫秒翻译成日期和分组?

如何在另一列中按条件分组的列中查找下一个日期?

在 SQL 中按组中的行计算时间差异

在 SQL/Impala 中按特定的分钟数对日期时间进行分组