lead和lag的簡單應用:
通過指定第二個參數來獲得前兩行和後兩行的內容,第三個參數表示超出範圍後的默認值
建表語句:
思路:首先要得到根據year分組,然後分別比較,如果相差爲1表示是連續的,另外將最大值和最小值列出來,語句如下
很顯然,差值爲0表示連續的,否則表示不連續,那麼將這個差值作爲過濾條件
這裏套一層查詢的原因是where條件後面不允許使用窗口函數
接下來再結合lag函數得到連續號段
這樣既可得到結果
SELECT rown,LAG(rown,2,-1) OVER(ORDER BY rown) PREVIOUS,
LEAD(rown,2,-1) OVER(ORDER BY rown) NEXT
FROM (SELECT ROWNUM+4 rown FROM dual CONNECT BY ROWNUM<5);
通過指定第二個參數來獲得前兩行和後兩行的內容,第三個參數表示超出範圍後的默認值
如果第二個參數超出範圍並且未設定默認值,則默認爲null
建表語句:
CREATE TABLE t_hd(YEAR NUMBER(5),
haoma NUMBER(10));
INSERT INTO t_hd VALUES(2014,00000001);
INSERT INTO t_hd VALUES(2014,00000002);
INSERT INTO t_hd VALUES(2014,00000003);
INSERT INTO t_hd VALUES(2014,00000004);
INSERT INTO t_hd VALUES(2014,00000005);
INSERT INTO t_hd VALUES(2014,00000007);
INSERT INTO t_hd VALUES(2014,00000008);
INSERT INTO t_hd VALUES(2014,00000009);
INSERT INTO t_hd VALUES(2013,00000120);
INSERT INTO t_hd VALUES(2013,00000121);
INSERT INTO t_hd VALUES(2013,00000122);
INSERT INTO t_hd VALUES(2013,00000124);
INSERT INTO t_hd VALUES(2013,00000125);
COMMIT;
思路:首先要得到根據year分組,然後分別比較,如果相差爲1表示是連續的,另外將最大值和最小值列出來,語句如下
SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb,
a.haoma,
MIN(a.haoma) OVER(PARTITION BY a.year) minhm,
MAX(a.haoma) OVER(PARTITION BY a.year) maxhm,
nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhi
FROM t_hd a;
很顯然,差值爲0表示連續的,否則表示不連續,那麼將這個差值作爲過濾條件
SELECT YEAR,bb,haoma,minhm,maxhm
FROM (SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb,
a.haoma,
MIN(a.haoma) OVER(PARTITION BY a.year) minhm,
MAX(a.haoma) OVER(PARTITION BY a.year) maxhm,
nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhi
FROM t_hd a)
WHERE chazhi<>0;
這裏套一層查詢的原因是where條件後面不允許使用窗口函數
接下來再結合lag函數得到連續號段
SELECT YEAR,haoma,nvl(LEAD(bb,1) OVER(PARTITION BY YEAR ORDER BY haoma),MAXhm) st
FROM (SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb,
a.haoma,
MIN(a.haoma) OVER(PARTITION BY a.year) minhm,
MAX(a.haoma) OVER(PARTITION BY a.year) maxhm,
nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhi
FROM t_hd a)
WHERE chazhi<>0;
這樣既可得到結果