使用 SQL window 函数更新下一行的值?

Using SQL window function to update values from next rows?

我有一个 table 每个客户都有一些范围。我需要这些范围没有重叠(较高行的最大值和较低行的最小值之间至少有 0.01 的差异)。

示例:

| Client | min | max |
|--------|-----|-----|
| A      |   1 | 2.5 |
| A      |   2 | 3.5 |
| A      | 3.5 |   4 |
| B      |   1 |   2 |
| B      |   3 |   5 |
| B      | 4.5 |  10 |

我需要这样的数据:

| Client | min  | max |
|--------|------|-----|
| A      |    1 | 2.5 |
| A      | 2.51 | 3.5 |
| A      | 3.51 |   4 |
| B      |    1 |   2 |
| B      |    3 |   5 |
| B      | 5.01 |  10 |

我需要使用window功能吗?感谢任何帮助。

如果您只想查询 returns 您的值,您可以使用:

select client,
       (case when min < lag(max) over (partition by client order by min)
             then lag(max) over (partition by client order by min) + 0.01
             else min
        end)
from t;

备注:

  • minmax 对于 table 名称来说是非常糟糕的选择,因为它们是 SQL 关键字。
  • 0.01 看起来很神奇。我会建议一种不同的方法,其中下限是包容性的而上限是独占的。这样,您就不会错过 5.0005 等值。
  • 如果您想 update table,最好的方法取决于您使用的数据库。

编辑:

如果您还需要重置 max(),请使用子查询:

select t.*,
       (case when max < new_min then new_max = new_min + 0.01 else max end) as new_max
from (select t.*,
             (case when min < lag(max) over (partition by client order by min)
                   then lag(max) over (partition by client order by min) + 0.01
                   else min
              end) as new_min
      from t
     ) t

但是,这在复杂的情况下可能不起作用。

考虑以下

select client,
  greatest(min, lag(max, 1, -777) over (partition by client order by min) + 0.01) min,
  greatest(max, min, lag(max, 1, -777) over (partition by client order by min) + 0.01) max
from `project.dataset.table`