hive 定位連續區間的起始位置和結束位置

2022-09-21 03:09:07 字數 1725 閱讀 1701

id 是上表temp_id_list_0209的主鍵, 表每一行包含日誌表中的乙個 id,現將一些 id 從 logs 表中刪除。編寫乙個 sql 查詢得到 logs 表中的連續區間的開始數字和結束數字,將查詢表按照 start_id 排序。

要求輸出結果為

start_id

end_id12

46912

create

table

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,借助函式構建差值

select

id, 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第二步、根據第一步結果,創造分組條件

select

id,

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 分組

select

min(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...