id 是上表temp_id_list_0209的主鍵, 表每一行包含日誌表中的乙個 id,現將一些 id 從 logs 表中刪除。編寫乙個 sql 查詢得到 logs 表中的連續區間的開始數字和結束數字,將查詢表按照 start_id 排序。
要求輸出結果為
start_id
end_id12
46912
createtable
temp_id_list_0209
( id
int) row format delimited
fields terminated by'
\t'stored
asorc
tblproperties ("orc.compress"
=insert
into
temp_id_list_0209
values (1
), (2),
(4),
(5),
(6),
(9),
(10),
(11),
(12)
;select
*from temp_id_list_0209;
第一步 :獲取id,借助函式構建差值
selectid, lag(id,
1, id) over (order
byid) df1,
id - lag(id, 1, id) over (order
byid) df2
from temp_id_list_0209;
iddf1
df2110
2114
2254
1651
96310
911110112
111第二步、根據第一步結果,創造分組條件
selectid,
sum(case
when dif2 >
1then
1else
0end) over (order
byid) flag
from (select id, id - lag(id, 1, id) over (order
byid) dif2
from temp_id_list_0209) o;
idflag10
2041
5161
92102
112122
第三步、根據flag 分組
selectmin(id) start_id,max
(id) end_id
from (select id, sum(if(diff >
1, 1, 0)) over (order
by id) as
flag
from (select
id , id
- lag(id, 1, id) over (order
by id) as
diff
from
temp_id_list_0209) o) t
group
byflag
order
by1;
start_id
end_id12
46912
MYSQL計算連續與不連續區間的方法
最近在看mysql技術內幕 sql程式設計時,發現裡面提到了乙個關於連續區間的經典問題,首先生成測試資料,目的是想查詢出rank表中,所有id的連續區間 書中提供的方法很巧妙,首先利用mysql中的變數計算出行號,由於行號是連續的,所以連續的數值與行號的差值就是乙個常量,當出現數值不連續時,差值就會...
1094 和為k的連續區間
一整數數列a1,a2,an 有正有負 以及另乙個整數k,求乙個區間 i,j 1 i j n 使得a i a j k。收起第1行 2個數n,k。n為數列的長度。k為需要求的和。2 n 10000,10 9 k 10 9 第2 n 1行 a i 10 9 a i 10 9 如果沒有這樣的序列輸出no s...
1094 和為k的連續區間
一整數數列a1,a2,an 有正有負 以及另乙個整數k,求乙個區間 i,j 1 i j n 使得a i a j k。收起第1行 2個數n,k。n為數列的長度。k為需要求的和。2 n 10000,10 9 k 10 9 第2 n 1行 a i 10 9 a i 10 9 如果沒有這樣的序列輸出no s...