SQL滞后于2维

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

假设我有一张“二维”表格:

对于每个元素,我希望找到其相邻的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 (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;