如何根据条件生成列的范围
How to generate ranges of a column based on condition
有一列数字 - 我想开发一个报告,将此列的值分类为范围(下限和上限)。如果值的差异超过 10,则必须发生这种拆分。这是否可以通过 Power BI 或 SQL 服务器中的查询来实现?
在SQL中,我会用lag()
和一个windowsum()
来定义分组,然后聚合:
select min(x) lower_limit, max(x) upper_limit
from (
select x, sum(case when x <= lag_x + 10 then 0 else 1 end) over(order by x) grp
from (select x, lag(x) over(order by x) lag_x from mytable) t
) t
group by grp
lag()
为您提供之前的值。然后,window sum 实现以下逻辑:每次当前值与前一个值之间的差值大于 10 时,新组开始。最后,外部查询按组聚合并计算下限和上限。
GMB 的解决方案绝对是解决此问题的规范方法,将其视为间隙和孤岛的变体。我想知道是否有一种方法可以在没有两级子查询的情况下执行此操作。还有:
select coalesce(lag(next_x) over (order by x), first_x) as lower,
x as upper
from (select t.*,
first_value(x) over (order by x) as first_x,
lead(x) over (order by x) as next_x
from t
) t
where next_x is null or next_x > x + 10;
Here 是一个 db<>fiddle.
比较大型数据集的性能会很有趣——2 window 函数 + 聚合与 3 window 函数 + 过滤。
有一列数字 - 我想开发一个报告,将此列的值分类为范围(下限和上限)。如果值的差异超过 10,则必须发生这种拆分。这是否可以通过 Power BI 或 SQL 服务器中的查询来实现?
在SQL中,我会用lag()
和一个windowsum()
来定义分组,然后聚合:
select min(x) lower_limit, max(x) upper_limit
from (
select x, sum(case when x <= lag_x + 10 then 0 else 1 end) over(order by x) grp
from (select x, lag(x) over(order by x) lag_x from mytable) t
) t
group by grp
lag()
为您提供之前的值。然后,window sum 实现以下逻辑:每次当前值与前一个值之间的差值大于 10 时,新组开始。最后,外部查询按组聚合并计算下限和上限。
GMB 的解决方案绝对是解决此问题的规范方法,将其视为间隙和孤岛的变体。我想知道是否有一种方法可以在没有两级子查询的情况下执行此操作。还有:
select coalesce(lag(next_x) over (order by x), first_x) as lower,
x as upper
from (select t.*,
first_value(x) over (order by x) as first_x,
lead(x) over (order by x) as next_x
from t
) t
where next_x is null or next_x > x + 10;
Here 是一个 db<>fiddle.
比较大型数据集的性能会很有趣——2 window 函数 + 聚合与 3 window 函数 + 过滤。