comments | difficulty | edit_url | tags | |
---|---|---|---|---|
true |
中等 |
|
表:Servers
+----------------+----------+ | Column Name | Type | +----------------+----------+ | server_id | int | | status_time | datetime | | session_status | enum | +----------------+----------+ (server_id, status_time, session_status) 是这张表的主键(有不同值的列的组合)。 session_status 是 ('start', 'stop') 的 ENUM (category)。 这张表的每一行包含 server_id, status_time 和 session_status。
编写一个解决方案来查找服务器 运行 的 总时间。输出应向下舍入为最接近的 整天数。
以 任意 顺序返回结果表。
结果格式如下所示。
示例:
输入:
Servers 表:
+-----------+---------------------+----------------+ | server_id | status_time | session_status | +-----------+---------------------+----------------+ | 3 | 2023-11-04 16:29:47 | start | | 3 | 2023-11-05 01:49:47 | stop | | 3 | 2023-11-25 01:37:08 | start | | 3 | 2023-11-25 03:50:08 | stop | | 1 | 2023-11-13 03:05:31 | start | | 1 | 2023-11-13 11:10:31 | stop | | 4 | 2023-11-29 15:11:17 | start | | 4 | 2023-11-29 15:42:17 | stop | | 4 | 2023-11-20 00:31:44 | start | | 4 | 2023-11-20 07:03:44 | stop | | 1 | 2023-11-20 00:27:11 | start | | 1 | 2023-11-20 01:41:11 | stop | | 3 | 2023-11-04 23:16:48 | start | | 3 | 2023-11-05 01:15:48 | stop | | 4 | 2023-11-30 15:09:18 | start | | 4 | 2023-11-30 20:48:18 | stop | | 4 | 2023-11-25 21:09:06 | start | | 4 | 2023-11-26 04:58:06 | stop | | 5 | 2023-11-16 19:42:22 | start | | 5 | 2023-11-16 21:08:22 | stop | +-----------+---------------------+----------------+
输出:
+-------------------+ | total_uptime_days | +-------------------+ | 1 | +-------------------+
解释:
- 对于 server ID 3:
- 从 2023-11-04 16:29:47 到 2023-11-05 01:49:47: ~9.3 小时
- 从 2023-11-25 01:37:08 到 2023-11-25 03:50:08: ~2.2 小时
- 从 2023-11-04 23:16:48 到 2023-11-05 01:15:48: ~1.98 小时
- 对于 server ID 1:
- 从 2023-11-13 03:05:31 到 2023-11-13 11:10:31: ~8 小时
- 从 2023-11-20 00:27:11 到 2023-11-20 01:41:11: ~1.23 小时
- 对于 server ID 4:
- 从 2023-11-29 15:11:17 到 2023-11-29 15:42:17: ~0.52 小时
- 从 2023-11-20 00:31:44 到 2023-11-20 07:03:44: ~6.53 小时
- 从 2023-11-30 15:09:18 到 2023-11-30 20:48:18: ~5.65 小时
- 从 2023-11-25 21:09:06 到 2023-11-26 04:58:06: ~7.82 小时
- 对于 server ID 5:
- 从 2023-11-16 19:42:22 到 2023-11-16 21:08:22: ~1.43 小时
我们可以使用窗口函数 LEAD
来获取每个服务器的下一个状态的时间,那么两个状态之间的时间差就是服务器的一次运行时间。最后我们将所有服务器的运行时间相加,然后除以一天的秒数,就得到了服务器的总运行天数。
# Write your MySQL query statement below
WITH
T AS (
SELECT
session_status,
status_time,
LEAD(status_time) OVER (
PARTITION BY server_id
ORDER BY status_time
) AS next_status_time
FROM Servers
)
SELECT FLOOR(SUM(TIMESTAMPDIFF(SECOND, status_time, next_status_time)) / 86400) AS total_uptime_days
FROM T
WHERE session_status = 'start';