使用 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;
备注:
min
和 max
对于 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`
我有一个 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;
备注:
min
和max
对于 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`