LeetCode Solution, Medium, 180. Consecutive Numbers

180. Consecutive Numbers

題目敘述

SQL Schema >

Create table If Not Exists Logs (id int, num int)
Truncate table Logs
insert into Logs (id, num) values ('1', '1')
insert into Logs (id, num) values ('2', '1')
insert into Logs (id, num) values ('3', '1')
insert into Logs (id, num) values ('4', '2')
insert into Logs (id, num) values ('5', '1')
insert into Logs (id, num) values ('6', '2')
insert into Logs (id, num) values ('7', '2')

Table: Logs

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+
id is the primary key for this table.

Write an SQL query to find all numbers that appear at least three times consecutively.

Return the result table in any order.

The query result format is in the following example.

Example 1:

Input:
Logs table:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+
Output:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
Explanation: 1 is the only number that appears consecutively for at least three times.

題目翻譯

從資料表 Logs 中找出連續出現至少三次的數值。以範例來說可以看到數值 2 雖然有三筆,但是並不是連續的(id 不是連續,中間差了一個 1),因此不算在答案。

解法解析

這題有兩個解法,我比較喜歡第二種的解法。第一種解法是官方給的,利用 Multiple Table 合併大資料表後再利用 idnum 做篩選,因為是結合一個大表之後才做篩選,覺得效能上不是很好。第二種解法則是使用了 LEAD 函數,其敘述可以參考這篇文章,簡單說的話就是可以查到當前資料的附近資料。 解法上就是另外 LEAD 拿到 num0 的下一行資料 num 和下下一行的資料 num

解法範例

MySQL
# Write your MySQL query statement below
SELECT
    DISTINCT l1.num AS ConsecutiveNums
FROM
    Logs l1,
    Logs l2,
    Logs l3
WHERE
    l1.id = l2.id - 1
    AND l2.id = l3.id - 1
    AND l1.num = l2.num
    AND l2.num = l3.num;
Runtime
# Write your MySQL query statement below
SELECT
    DISTINCT r.num0 AS ConsecutiveNums
FROM
    (
        SELECT
            num AS num0,
            LEAD(num, 1) OVER() AS num1,
            LEAD(num, 2) OVER() AS num2
        FROM
            logs
    ) AS r
WHERE
    r.num1 = r.num2
    AND r.num0 = r.num1

Did you find this article valuable?

Support 攻城獅 by becoming a sponsor. Any amount is appreciated!