SQL SERVER - Выберите значение следующей строки длиной до 5 символов, а затем замените первый символ новым. - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть ситуация, когда я хочу прочитать следующее значение того же столбца и объединить его до пяти символов и сохранить его в другом столбце, но я не могу этого сделать. Пожалуйста, см. Ниже для лучшей визуализации.

Вот входные данные

------------------------------
|      ID      |   word      |
------------------------------
|       1      |      M      |
|       2      |      V      |
|       3      |      V      |
|       4      |      M      |
|       5      |      V      |
|       6      |      M      |
|       7      |      V      |
|       8      |      M      |
|       9      |      V      |
|       10     |      V      |
------------------------------

Желаемый результат:

-------------------------------------------- 
|      ID      |   word      |  expected   |
--------------------------------------------
|       1      |      M      |      M      |
|       2      |      V      |      MV     |
|       3      |      V      |      MVV    |
|       4      |      M      |      MVVM   |
|       5      |      V      |      MVVMV  |
|       6      |      M      |      VVMVM  |
|       7      |      V      |      VMVMV  |
|       8      |      M      |      MVMVM  |
|       9      |      V      |      VMVMV  |
|       10     |      V      |      MVMVV  |
--------------------------------------------

В этом ожидаемом столбце после добавления 5-го символа, когда он переходит к 6-й строке и пытается добавить, сначала он удалит первый символ «M» из «MVVMV» (5-я строка), а затем добавит «M» из 6-й строки в конце «MVVMV», который будет «VVMVM»

я надеюсь, что вы получите это logi c так как я пробовал много способов добиться этого, но не повезло

Спасибо

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете использовать lag() и concat():

select t.*,
       concat(lag(word, 4) over (order by id),
              lag(word, 3) over (order by id),
              lag(word, 2) over (order by id),
              lag(word, 1) over (order by id),
              word
             ) as concat_5
from t;

К сожалению, SQL Сервер (пока) не поддерживает STRING_AGG() в качестве оконной функции. Если это так, вы можете использовать:

select t.*,
       string_agg(word) within group (order by id) over
            (order by id rows between 4 preceding and current row) as concat_5
from t;
...