SQL滞后于2维
假设我有一张“二维”表格: 对于每个元素,我希望找到其相邻的left、up和up-left元素: 左: 向上: 左上角:SQL滞后于2维,sql,sql-server,Sql,Sql Server,假设我有一张“二维”表格: 对于每个元素,我希望找到其相邻的left、up和up-left元素: 左: 向上: 左上角: Y\X 1 2 3 1 Null Null Null 2 Null 10 20 3 Null 40 50 我尝试了以下查询: select X, Y, value, lag(value,1) over (partition by X order by Y) as up_value, lag(value,1) over (part
Y\X 1 2 3
1 Null Null Null
2 Null 10 20
3 Null 40 50
我尝试了以下查询:
select X, Y, value,
lag(value,1) over (partition by X order by Y) as up_value,
lag(value,1) over (partition by Y order by X) as left_value,
lag(value,4) over (order by X,Y) as up_left_value
from tt
order by X,Y
它确实正确地返回了“left”和“up”,但不完全是“upleft”(突出显示为“error”):
xy值向上\u值左\u值向上\u左\u值
1110 NL NL NL NL NL
2 1 2 20 10荷兰
3 1 3 30 20新界北
42140NL10NL
5 2 2 50 40 20 10
6 2 3 60 50 30 20
7 3 1 70 NL 40*30*(对于upleft,您需要“向上”的“左”(或“向上”的左),因此使用两个步骤:
select t.*,
lag(up) over (partition by y order by x) as upleft
from (select x, y, value,
lag(value) over (partition by x order by y) as up,
lag(value) over (partition by y order by x) as left
from t
) t;
我考虑过这个解决方案,但实际上我的搜索是三维的,这将使查询非常长,只需两个步骤。任何简单的解决方案都可以对“ORDER BY”设置一些约束?@HailiangZhang…我不明白为什么这会对性能产生显著影响。你应该试试。谢谢!性能方面没问题,只是查询更大。
Y\X 1 2 3
1 Null Null Null
2 Null 10 20
3 Null 40 50
select X, Y, value,
lag(value,1) over (partition by X order by Y) as up_value,
lag(value,1) over (partition by Y order by X) as left_value,
lag(value,4) over (order by X,Y) as up_left_value
from tt
order by X,Y
X Y value up_value left_value up_left_value
1 1 1 10 NL NL NL
2 1 2 20 10 NL NL
3 1 3 30 20 NL NL
4 2 1 40 NL 10 NL
5 2 2 50 40 20 10
6 2 3 60 50 30 20
7 3 1 70 NL 40 *30*(<- WRONG, should be "NL")
8 3 2 80 70 50 40
9 3 3 90 80 60 50
select t.*,
lag(up) over (partition by y order by x) as upleft
from (select x, y, value,
lag(value) over (partition by x order by y) as up,
lag(value) over (partition by y order by x) as left
from t
) t;