找到连续区间的开始和结束数字
这题题目就给了一张表,题目非常的短,但是没有想好思路,实则非常难处理。这个地方我们可以使用窗口函数进行辅助解题。思路如下:
logid | row_number() | log_id-row_number() |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 3 | 0 |
7 | 4 | 3 |
8 | 5 | 3 |
10 | 6 | 4 |
通过上面的使用row_number()排名后再相减,我们能发现,连续的数字相减的结果是相同的,那么我们使用这个辅助列group 不要后求最大最小即可。
首先先排名
select log_id,row_number() over(order by log_id) rr from Logs
排名后相减
select log_id,log_id-rr lr from (
select log_id,row_number() over(order by log_id) rr from Logs) F1
对相减的结果求最大最小即可得出结果
select min(log_id) start_id,max(log_id) end_id from (
select log_id,log_id-rr lr from (
select log_id,row_number() over(order by log_id) rr from Logs) F1) F2 group by lr order by start_id
最后提交结果如下: