3

このクエリは次の結果を返します...

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

from および to として連続する週が返される次の結果を作成することは可能ですか。(例: 1、2、3、4 などではなく 1 ~ 10)

WKS               COST
----------------------
17-19, 21         446
26-28             588
4

1 に答える 1

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でのデモ。

于 2013-10-09T11:32:24.573 に答える