單條SQL語句實現複雜邏輯的幾個例子(4)
一、 將列值為0的列替換為距離它最近列的非0值
記錄集如下:
ADDDATE ADDVALUE
-------------- ---------------
2007-03-01 0
2007-03-02 0
2007-03-05 3.64
2007-03-06 3.82
2007-03-07 0
2007-03-08 3.47
2007-03-09 0
2007-03-12 0
2007-03-13 4.01
2007-03-14 4.21
2007-03-15 4.12
2007-03-16 0
2007-03-17 0
用SQL實現如下效果:
ADDDATE ADDVALUE
-------------- ---------------
2007-03-01 3.64
2007-03-02 3.64
2007-03-05 3.64
2007-03-06 3.82
2007-03-07 3.47
2007-03-08 3.47
2007-03-09 4.01
2007-03-12 4.01
2007-03-13 4.01
2007-03-14 4.21
2007-03-15 4.12
2007-03-16 0
2007-03-17 0
建表語句如下:
create table tmp4 (adddate varchar2(20),addvalue number);
insert into tmp4 values ('2007-03-01',0);
insert into tmp4 values ('2007-03-02',0);
insert into tmp4 values ('2007-03-05',3.64);
insert into tmp4 values ('2007-03-06',3.82);
insert into tmp4 values ('2007-03-07',0);
insert into tmp4 values ('2007-03-08',3.47);
insert into tmp4 values ('2007-03-09',0);
insert into tmp4 values ('2007-03-12',0);
insert into tmp4 values ('2007-03-13',4.01);
insert into tmp4 values ('2007-03-14',4.21);
insert into tmp4 values ('2007-03-15',4.12);
insert into tmp4 values ('2007-03-16',0);
insert into tmp4 values ('2007-03-17',0);
Commit;
解題思路:
別想歪了,這道題用lead,lag之類分析函式是不行地,費事又不討好,最簡單的方式,如果不考慮執行效率的話,可以這樣:
JSSWEB> select a.adddate,
2 decode(a.addvalue,0, nvl((select b.addvalue
3 from tmp4 b
4 where b.adddate > a.adddate
5 and b.addvalue != 0
6 and rownum = 1),0),a.addvalue) addvalue
7 from tmp4 a
8 ;
ADDDATE ADDVALUE
-------------------- ----------
2007-03-01 3.64
2007-03-02 3.64
2007-03-05 3.64
2007-03-06 3.82
2007-03-07 3.47
2007-03-08 3.47
2007-03-09 4.01
2007-03-12 4.01
2007-03-13 4.01
2007-03-14 4.21
2007-03-15 4. 1 2
2007-03-16 0
2007-03-17 0
正如前文所說,這種方式效率實在堪憂,尤其是當tmp4記錄量較大時,畢竟count(0)+1次tmp4表的掃描所花代價較大。
我們知道,上述形式的語句通常都是可以轉換成連線查詢的,因此,稍做轉換:
JSSWEB> select ad1, decode(cw, 1, av1, 2, av2, 3, av1) adv
2 from (select c.*, row_number() over(partition by ad1 order by ad2) rn
3 from (select a.adddate ad1,
4 a.addvalue av1,
5 b.adddate ad2,
6 b.addvalue av2,
7 case
8 when a.addvalue != 0 then
9 1
10 when b.adddate > a.adddate and a.addvalue = 0 then
11 2
12 when b.adddate is null and a.addvalue = 0 then
13 3
14 else
15 0
16 end as cw
17 from tmp4 a, tmp4 b
18 where b.addvalue(+) != 0
19 and b.adddate(+)>a.adddate
20 order by a.adddate) c
21 where cw != 0)
22 where rn = 1
23 ;
AD1 ADV
-------------------- ----------
2007-03-01 3.64
2007-03-02 3.64
2007-03-05 3.64
2007-03-06 3.82
2007-03-07 3.47
2007-03-08 3.47
2007-03-09 4.01
2007-03-12 4.01
2007-03-13 4.01
2007-03-14 4.21
2007-03-15 4.12
2007-03-16 0
2007-03-17 0
稍加一點難度,如果希望的結果集是這樣,又該怎麼樣實現呢:
ADDDATE ADDVALUE
-------------- ---------------
2007-03-01 3.64
2007-03-02 3.64
2007-03-05 3.64
2007-03-06 3.82
2007-03-07 3.47
2007-03-08 3.47
2007-03-09 4.01
2007-03-12 4.01
2007-03-13 4.01
2007-03-14 4.21
2007-03-15 4.12
2007-03-16 4.12
2007-03-17 4.12
並不困難,只要對我們的sql稍加改動即可........
========================
Space單篇字數限制,繼續檢視:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-243689/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單條SQL語句實現複雜邏輯的幾個例子(4)續~SQL
- 單條SQL語句實現複雜邏輯的幾個例子(1)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(2)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(3)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(5)SQL
- 單條SQL語句實現複雜邏輯幾例~~SQL
- 簡單的幾條Insert語句引起的邏輯Standby應用延遲的診斷
- 詳解SQL中Groupings Sets 語句的功能和底層實現邏輯SQL
- 複雜控制語句
- 實現四則運算的一條sql語句SQL
- SQL Select語句邏輯執行順序SQL
- 一條簡單SQL語句的構成及語句解析SQL
- SQL語句的4個階段SQL
- 使用vue解決複雜邏輯Vue
- 重構遺留程式碼(3):複雜的條件語句
- 一個複雜的json例子JSON
- SVG 實現複雜線條動畫SVG動畫
- Oracle sql with 語句語法與例子OracleSQL
- 如何將SQL寫成複雜邏輯 和構造資料SQL
- 複雜查詢語句的使用
- 幾個定位、查詢session的sql語句SessionSQL
- 命令列寫複雜語句命令列
- 低程式碼平臺想要實現複雜的業務流程,這4個條件不能少!
- PLSQL Language Referenc-4PL/SQL控制語句-條件選擇語句-IF THENSQL
- 常見邏輯語句逆向分析
- Oracle AWR中常用到的幾個SQL語句OracleSQL
- RxJava 系列番外篇:一個 RxJava 解決複雜業務邏輯的案例RxJava
- 單個SQL語句的10046 traceSQL
- 一條SQL語句的書寫SQL
- 一條很 巧妙的 SQL 語句SQL
- 一條sql語句的優化SQL優化
- 一條SQL語句的旅行之路SQL
- sql語句實現表的行列倒置SQL
- 狀態機解決複雜邏輯及使用
- 如何應對報表開發中的複雜邏輯
- PL/SQL 條件控制語句SQL
- WPF使用Shape實現複雜線條動畫動畫
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-簡單CASESQL