Oracle SQL-将连续数字设置为一个范围
此查询返回以下结果Oracle SQL-将连续数字设置为一个范围,sql,oracle,Sql,Oracle,此查询返回以下结果 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; 是否可以创建以下结果,其中连续的周返回为from和to。(例如1-10而不是1、2、3、4等) 在这个问题中,您必须确定连续几周的顺序并将其分组。这是我的解决办法
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;
是否可以创建以下结果,其中连续的周返回为from和to。(例如1-10而不是1、2、3、4等)
在这个问题中,您必须确定连续几周的顺序并将其分组。这是我的解决办法
- 使用滞后功能识别序列中的任何中断
- 使用SUM函数为每个序列分配一个组号
- 找出每组的开始和结束周
- 最后,使用listag函数聚合结果
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;
演示在。第二行不是应该是“26-28”吗?很好!我会改变的…我需要一段时间来思考这个问题,但这正是我想要的。。。谢谢
WKS COST
----------------------
17-19, 21 446
26-28 588
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;