gpt4 book ai didi

mysql - 不计数的时间求和范围重叠两次

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:17 24 4
gpt4 key购买 nike

对于给定的用户 ID“1”和给定的一天 2018-01-02,我想计算记录的总小时数,其中可能存在重叠。

计算这个子集:

+-----+---------------------+---------------------+
| uid | time_start | time_end |
+-----+---------------------+---------------------+
| 1 | 2018-01-02 04:00:00 | 2018-01-02 04:30:00 |
| 1 | 2018-01-02 04:25:00 | 2018-01-02 04:35:00 |
| 1 | 2018-01-02 04:55:00 | 2018-01-02 05:15:00 |
+-----+---------------------+---------------------+

结果时间应该是:00:55

最佳答案

MariaDB 10.3 具有窗口函数和 CTE,因此您可以使用它们来生成结果。 CTE 通过将当前 time_start 与当天的最大先前 time_end 进行比较并取其最大(最大)值,然后进行查询,从而消除 session 时间的重叠只需 SUM 每次 session 时间,按用户 ID 和日期分组。请注意,如果一个 session 与另一个 session 完全重叠,则 CTE 会将 startend 时间设置为重叠 session 的 end 时间,从而有效 session 长度为 0。我扩展了我的演示以包含这样的场景,以及多个重叠 session :

WITH sessions AS 
(SELECT uid,
GREATEST(time_start, COALESCE(MAX(time_end) OVER (PARTITION BY DATE(time_start) ORDER BY time_start ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), '2000-01-01')) AS start,
MAX(time_end) OVER (PARTITION BY DATE(time_start) ORDER BY time_start ROWS UNBOUNDED PRECEDING) AS end
FROM sessions)
SELECT uid, DATE(start) AS `date`, SEC_TO_TIME(SUM(TO_SECONDS(end) - TO_SECONDS(start))) AS totaltime
FROM sessions
GROUP BY uid, `date`

输出:

uid     date        totaltime
1 2018-01-02 00:55:00
1 2018-01-03 01:00:00
1 2018-01-04 01:15:00

Demo on dbfiddle

关于mysql - 不计数的时间求和范围重叠两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54545433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com