Sql 如何根据条件生成列的范围

Sql 如何根据条件生成列的范围,sql,sql-server,powerbi,window-functions,gaps-and-islands,Sql,Sql Server,Powerbi,Window Functions,Gaps And Islands,这里有一列数字——我想编写一份报告,将该列的值分为下限和上限。如果值之间的差异大于10,则必须进行此拆分。这是通过Power BI或SQL Server中的查询实现的吗 在SQL中,我将使用滞后和窗口和来定义组,然后聚合: 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) gr

这里有一列数字——我想编写一份报告,将该列的值分为下限和上限。如果值之间的差异大于10,则必须进行此拆分。这是通过Power BI或SQL Server中的查询实现的吗

在SQL中,我将使用滞后和窗口和来定义组,然后聚合:

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

滞后为您提供上一个值。然后,窗口和实现以下逻辑:每次当前值和上一个值之间的差值超过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;
他是一把小提琴


比较一大组数据的性能会很有趣-2个窗口函数+聚合与3个窗口函数+过滤。

请提供获得专栏和预期结果的示例数据。所有内容都是格式化文本,而不是可以使用的图像。感谢您的回复!它像一个冠军一样工作,我只需要对求和代码做一个小小的更改-如果差值大于10,则为0,否则为1。谢谢@Gordon,此查询还以我期望的格式返回结果。这是一个聪明的方法。@GMB。非常感谢。