號段選取應用之已知號碼求號段(讀書筆記之一)

lead和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;


這樣既可得到結果
發佈了50 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章