Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 242c377

Browse files
feat: add solutions to lc problem: No.1285 (doocs#1798)
No.1285.Find the Start and End Number of Continuous Ranges
1 parent 29bf43c commit 242c377

File tree

4 files changed

+83
-24
lines changed

4 files changed

+83
-24
lines changed

‎.prettierrc‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"solution/1100-1199/1174.Immediate Food Delivery II/Solution.sql",
2828
"solution/1100-1199/1193.Monthly Transactions I/Solution.sql",
2929
"solution/1200-1299/1205.Monthly Transactions II/Solution.sql",
30+
"solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/Solution.sql",
3031
"solution/1300-1399/1384.Total Sales Amount by Year/Solution.sql",
3132
"solution/1300-1399/1322.Ads Performance/Solution.sql",
3233
"solution/1300-1399/1393.Capital GainLoss/Solution.sql",

‎solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/README.md‎

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,51 @@ Logs 表:
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:分组 + 窗口函数**
67+
68+
我们需要想办法将一段连续的日志分到同一组,然后对每一组进行聚合操作,得到每一组的开始日志和结束日志。
69+
70+
分组可以用以下两种方法实现:
71+
72+
1. 通过计算每个日志与前一个日志的差值,如果差值为 1ドル,ドル则说明这两个日志是连续的,我们设置 $delta$ 为 0ドル,ドル否则设置为 1ドル$。然后我们对 $delta$ 求前缀和,得到的结果就是每一行的分组的标识符。
73+
2. 通过计算当前行的日志减去当前行的行号,得到的结果就是每一行的分组的标识符。
74+
6675
<!-- tabs:start -->
6776

6877
### **SQL**
6978

7079
```sql
71-
SELECT
72-
MIN(log_id) AS start_id,
73-
MAX(log_id) AS end_id
74-
FROM
75-
(
80+
# Write your MySQL query statement below
81+
WITH
82+
T AS (
83+
SELECT
84+
log_id,
85+
sum(delta) OVER (ORDER BY log_id) AS pid
86+
FROM
87+
(
88+
SELECT
89+
log_id,
90+
if((log_id - lag(log_id) OVER (ORDER BY log_id)) = 1, 0, 1) AS delta
91+
FROM Logs
92+
) AS t
93+
)
94+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
95+
FROM T
96+
GROUP BY pid;
97+
```
98+
99+
```sql
100+
# Write your MySQL query statement below
101+
WITH
102+
T AS (
76103
SELECT
77104
log_id,
78-
log_id - ROW_NUMBER() OVER (ORDER BY log_id) AS rk
105+
log_id - row_number() OVER (ORDER BY log_id) AS pid
79106
FROM Logs
80-
) AS t
81-
GROUP BY rk;
107+
)
108+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
109+
FROM T
110+
GROUP BY pid;
82111
```
83112

84113
<!-- tabs:end -->

‎solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/README_EN.md‎

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,51 @@ Number 10 is contained in the table.
5959

6060
## Solutions
6161

62+
**Solution 1: Group By + Window Function**
63+
64+
We need to find a way to group a continuous sequence of logs into the same group, and then aggregate each group to obtain the start and end logs of each group.
65+
66+
There are two ways to implement grouping:
67+
68+
1. By calculating the difference between each log and the previous log, if the difference is 1ドル,ドル then the two logs are continuous, and we set $delta$ to 0ドル,ドル otherwise we set it to 1ドル$. Then we take the prefix sum of $delta$ to obtain the grouping identifier for each row.
69+
2. By calculating the difference between the current log and its row number, we obtain the grouping identifier for each row.
70+
6271
<!-- tabs:start -->
6372

6473
### **SQL**
6574

6675
```sql
67-
SELECT
68-
MIN(log_id) AS start_id,
69-
MAX(log_id) AS end_id
70-
FROM
71-
(
76+
# Write your MySQL query statement below
77+
WITH
78+
T AS (
79+
SELECT
80+
log_id,
81+
sum(delta) OVER (ORDER BY log_id) AS pid
82+
FROM
83+
(
84+
SELECT
85+
log_id,
86+
if((log_id - lag(log_id) OVER (ORDER BY log_id)) = 1, 0, 1) AS delta
87+
FROM Logs
88+
) AS t
89+
)
90+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
91+
FROM T
92+
GROUP BY pid;
93+
```
94+
95+
```sql
96+
# Write your MySQL query statement below
97+
WITH
98+
T AS (
7299
SELECT
73100
log_id,
74-
log_id - ROW_NUMBER() OVER (ORDER BY log_id) AS rk
101+
log_id - row_number() OVER (ORDER BY log_id) AS pid
75102
FROM Logs
76-
) AS t
77-
GROUP BY rk;
103+
)
104+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
105+
FROM T
106+
GROUP BY pid;
78107
```
79108

80109
<!-- tabs:end -->
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
SELECT
2-
MIN(log_id) AS start_id,
3-
MAX(log_id) AS end_id
4-
FROM
5-
(
1+
# Write your MySQL query statement below
2+
WITH
3+
T AS (
64
SELECT
75
log_id,
8-
log_id- ROW_NUMBER() OVER (ORDER BY log_id) AS rk
6+
log_id-row_number() OVER (ORDER BY log_id) AS pid
97
FROM Logs
10-
) AS t
11-
GROUP BY rk;
8+
)
9+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
10+
FROM T
11+
GROUP BY pid;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /