SQL LAG в двух измерениях - PullRequest
1 голос
/ 04 октября 2019

Допустим, у меня есть "двумерная" таблица:

 Y\X  1  2  3
 1   10 20 30
 2   40 50 60
 3   70 80 90

Для каждого элемента я хочу найти смежные элементы слева, вверх и вверх:

Слева:

 Y\X  1  2  3
 1  Null 20 30
 2  Null 40 50
 3  Null 70 80

Вверх:

 Y\X  1  2  3
 1 Null Null Null
 2   10 20 30
 3   40 50 60

Вверх-влево:

 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

Моя игровая площадка здесь: https://rextester.com/BXJ66520

Как мне исправить проблему «вверх-влево»?

1 Ответ

1 голос
/ 04 октября 2019

Для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...