特殊SQL1

-- 在ITPUB上看到的一個帖子,要求將以下數據

數據如下:
name   dates       num
張三        20120101      6
張三        20120102      6
張三        20120103      2
張三        20120104      2
張三        20120105      6
張三        20120106      6
張三        20120107      3

轉換成以下
展示結果:
name       from         to                  value
張三          201201  201202           6
張三          201203  201204           2
張三          201205  201206           6
張三          201207  201207           3


-- 思路,運用LAG函數

-- 代碼如下:

with t as 
(
select '張三' name,   '20120101' dates,      6  num from dual union all
select '張三' name,   '20120102' dates,      6  num from dual union all
select '張三' name,   '20120103' dates,      2  num from dual union all
select '張三' name,   '20120104' dates,      2  num from dual union all
select '張三' name,   '20120105' dates,      6  num from dual union all
select '張三' name,   '20120106' dates,      6  num from dual union all
select '張三' name,   '20120107' dates,      3  num from dual
)

select name,
       min(dates) vfrom,
       max(dates) vto,
       num
  from (
select name,
       dates,
       num,
       max(flag) over(partition by name order by dates) rn
  from (select t.*, 
               decode(num, lag(num) over(partition by name order by dates),0,
                           row_number() over(partition by name order by dates)) flag
          from t))
 group by name, rn, num;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章