關於號段選取的sql寫法
這個好像這兩個問題的逆問題
http://blog.itpub.net/post/7102/44843
http://blog.itpub.net/post/7102/48132
表A結構:
bill_type_id varchar2(1),
bill_start number,
bill_end number,
office_level varchar2(4)
資料如下:
A 0 999 1
A 0 199 2
A 300 499 2
A 700 799 2
sql目的是取出包含在level1級別裡的,還沒有錄入level2級別的號段,各位大俠有好方法,請告知小弟.最好是一個sql語句實現,謝謝!
原文地址:http://www.itpub.net/480536.html
[@more@]表結構以及測試資料
CREATE TABLE T8
(
A NUMBER(4),
B NUMBER(4),
C NUMBER(4),
Q VARCHAR2(1 BYTE)
);
Insert into T8
(A, B, C, Q)
Values
(555, 666, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(100, 199, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(0, 999, 1, 'A');
Insert into T8
(A, B, C, Q)
Values
(300, 499, 2, 'A');
COMMIT;
select S,E from
(
SELECT NVL2(LAG(A)OVER(PARTITION BY Q ORDER BY A),B+1,MIN(A)OVER(PARTITION BY Q)) S,
NVL(LEAD(A)OVER(PARTITION BY Q ORDER BY A)-1,MAX(B)OVER(PARTITION BY Q)) E
from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
)
where s<=e
程式碼:
SQL> select * from t8;
A B C Q ---------- ---------- ---------- -
555 666 2 A
100 199 2 A
0 999 1 A
300 499 2 A
200 299 2 A
已用時間: 00: 00: 00.00
Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T8'
SQL> select S,E from
2 (
3 SELECT NVL2(LAG(A)OVER(PARTITION BY Q ORDER BY A),B+1,MIN(A)OVER(PARTITION BY Q)) S,
4 NVL(LEAD(A)OVER(PARTITION BY Q ORDER BY A)-1,MAX(B)OVER(PARTITION BY Q)) E
5 from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
6 )
7 where s<=e
8 /
S E ---------- ----------
0 99
500 554
667 999
已用時間: 00: 00: 00.00
Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 VIEW
2 1 WINDOW (SORT)
3 2 CONNECT BY (WITH FILTERING)
4 3 NESTED LOOPS
5 4 TABLE ACCESS (FULL) OF 'T8'
6 4 TABLE ACCESS (BY USER ROWID) OF 'T8'
7 3 NESTED LOOPS
8 7 BUFFER (SORT)
9 8 CONNECT BY PUMP
10 7 TABLE ACCESS (FULL) OF 'T8'
.................
Q:level 1 級別的號段可能是分段的 如0-9999 20000-29999
A:關於分段的問題,你可以把資料增加一個分段標誌
比如0~9999,20000~29999,,級別都為1,分段標誌分別為1,2
假設級別2的資料有0~99, 300~1999, 21000~22999
那麼前兩個的分段標誌就設為1,後一個就設為2
然後在上面的sql中,partition by後面加上這個分段標誌就可以了
思路大致如此
select S,E from
(
SELECT NVL2(LAG(A)OVER(PARTITION BY Q, xx ORDER BY A),B+1,MIN(A)OVER(PARTITION BY Q, xx)) S,
NVL(LEAD(A)OVER(PARTITION BY Q, xx ORDER BY A)-1,MAX(B)OVER(PARTITION BY Q, xx)) E from
(
select t8.*, nvl(prior a,a) xx from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
and A>= prior a and b<= prior b
)
)
where s<=e
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29867/viewspace-813348/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於auto increment的寫法REM
- Update 多個關聯表SQL的寫法SQL
- c/c++ 關於swap的不同寫法C++
- T-SQL——關於時間段類報表SQL
- 關於fNIRS帶通濾波頻段選擇
- 【原】關於資料倉儲中複雜報表SQL語句的寫法SQL
- 關於優化器提示使用逗號的語法優化
- 關於利用go實現非同步讀寫的寫法分享Go非同步
- SQL常用的特殊寫法SQL
- Oracle層次查詢和分析函式在號段選取中的應用Oracle函式
- Oracle SQL寫法OracleSQL
- [20160314]關於sql寫法問題使用=還是用inSQL
- 關於VS報無法解析外部符號的錯誤符號
- 關於SYS使用者無法使用延遲段建立的示例
- Oracle層次查詢和分析函式在號段選取中的應用(轉)Oracle函式
- sql寫法小記SQL
- 關於谷歌賬號註冊手機號無法驗證的解決方法谷歌
- SQL查詢連續號碼段的解法(例項)SQL
- 轉 SQL查詢連續號碼段的巧妙解法SQL
- SQL語句規範的寫法SQL
- Mysql 分組排序的sql寫法MySql排序
- OCI插入SQL語句的寫法SQL
- 關於正則的 符號,獲取控制 都代表什麼意思?符號
- 個人線段樹寫法 & 注意逝項
- SQL Server關於AlwaysOn的理解-讀寫分離的誤區(一)SQLServer
- 學習-SQL查詢連續號碼段的巧妙解法SQL
- 關於單例模式,你需要知道的幾種寫法單例模式
- 關於線段樹基礎
- 關於SQL Serve資料庫r帳號被禁用的處理方法SQL資料庫
- 選取組內最小值的sqlSQL
- 許可權控制下的SQL寫法SQL
- 關於我對於寫部落格寫文章的理解
- MyBatis SQL xml處理小於號與大於號正確的格式MyBatisSQLXML
- CSS選擇器中大於號>的作用CSS
- 關於laravel計算程式執行時間的優雅寫法Laravel
- 易語言關於微信收款監控軟體寫法的思考
- 關於快取快取
- MyBatis SQL處理大於、小於號MyBatisSQL