2013-10-09 25 views
3

此查詢返回的結果如下...的Oracle SQL - 設置連續的數字作爲一系列

WITH t(wk, COST) AS 
(SELECT wk, COST FROM myTable WHERE id = '345') 
SELECT listagg(wk,',') WITHIN GROUP(ORDER BY wk) AS wks, COST 
FROM t 
GROUP BY COST; 

...

WKS    COST 
---------------------- 
17, 18, 19, 21 446 
26, 27, 28  588 

是否有可能創建下列結果,其中連續兩週都從和返回。 (例如1-10而不是1,2,3,4 ...等)

WKS    COST 
---------------------- 
17-19, 21   446 
26-28    588 
+1

不應該第二行是'26 -28'? –

+0

好點!我會改變這一點... – Tom

回答

3

在這個問題中,你必須確定連續幾周的週期並對它們進行分組。這是我的解決方案。

  • 使用LAG函數來識別序列中的任何中斷。
  • 使用SUM功能爲每個序列分配組號。
  • 查找每個組的起始和結束周。
  • 最後使用LISTAGG函數來彙總結果。

查詢:

with x(wk, cost, startgroup) as(
    --identify the start of a sequence 
    select wk, cost, 
      case when wk = lag(wk,1) over (partition by cost order by wk) + 1 
       then 0 
       else 1 
      end 
    from mytable 
    where id = '345' 
    ), 
    y(wk, cost, grp) as(
    --assign group number 
    select wk, cost, 
      sum(startgroup) over (partition by cost order by wk) 
    from x 
    ), 
    z(wk, cost, grp) as(
    --get the max/min week for each group 
    select case when min(wk) = max(wk) 
       then cast(min(wk) as varchar2(10)) 
       else min(wk) ||'-'||max(wk) 
       end, 
      cost, grp 
    from y 
    group by cost, grp 
    ) 
--aggregate by cost 
select listagg(wk,',') within group(order by grp), 
cost 
from z 
group by cost; 

演示在sqlfiddle

+0

要花點時間來解決這個問題,但這正是我要找的......謝謝! – Tom