Welcome to Subscribe On Youtube

3126. Server Utilization Time 🔒

Description

Table: Servers

+----------------+----------+
\| Column Name    \| Type     \|
+----------------+----------+
\| server_id      \| int      \|
\| status_time    \| datetime \|
\| session_status \| enum     \|
+----------------+----------+
(server_id, status_time, session_status) is the primary key (combination of columns with unique values) for this table.
session_status is an ENUM (category) type of ('start', 'stop').
Each row of this table contains server_id, status_time, and session_status.

Write a solution to find the total time when servers were running. The output should be rounded down to the nearest number of full days.

Return the result table in any order.

The result format is in the following example.

 

Example:

Input:

Servers table:

+-----------+---------------------+----------------+
\| 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           \|
+-----------+---------------------+----------------+

Output:

+-------------------+
\| total_uptime_days \|
+-------------------+
\| 1                 \|
+-------------------+

Explanation:

  • For server ID 3:
    • From 2023-11-04 16:29:47 to 2023-11-05 01:49:47: ~9.3 hours
    • From 2023-11-25 01:37:08 to 2023-11-25 03:50:08: ~2.2 hours
    • From 2023-11-04 23:16:48 to 2023-11-05 01:15:48: ~1.98 hours
    Total for server 3: ~13.48 hours
  • For server ID 1:
    • From 2023-11-13 03:05:31 to 2023-11-13 11:10:31: ~8 hours
    • From 2023-11-20 00:27:11 to 2023-11-20 01:41:11: ~1.23 hours
    Total for server 1: ~9.23 hours
  • For server ID 4:
    • From 2023-11-29 15:11:17 to 2023-11-29 15:42:17: ~0.52 hours
    • From 2023-11-20 00:31:44 to 2023-11-20 07:03:44: ~6.53 hours
    • From 2023-11-30 15:09:18 to 2023-11-30 20:48:18: ~5.65 hours
    • From 2023-11-25 21:09:06 to 2023-11-26 04:58:06: ~7.82 hours
    Total for server 4: ~20.52 hours
  • For server ID 5:
    • From 2023-11-16 19:42:22 to 2023-11-16 21:08:22: ~1.43 hours
    Total for server 5: ~1.43 hours
The accumulated runtime for all servers totals approximately 44.46 hours, equivalent to one full day plus some additional hours. However, since we consider only full days, the final output is rounded to 1 full day.

Solutions

Solution 1: Using Window Functions

We can use the window function LEAD to get the time of the next status for each server. The time difference between two statuses is the running time of the server. Finally, we add up the running time of all servers, then divide by the number of seconds in a day to get the total running days of the servers.

  • # 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';
    
    

All Problems

All Solutions