SQL Server: добавление повторяющегося значения с номером для различения строк - PullRequest
0 голосов
/ 21 октября 2019

Я пишу запрос для извлечения данных с использованием JOIN из трех таблиц.

В результате у меня повторяется основной столбец (Col1), как показано ниже.

Col1 |Col2  |Col3
-----+------+-------
111  |1     |23
111  |2     |21
112  |1     |11
112  |2     |13
112  |3     |12
113  |1     |4
113  |2     |4
113  |3     |4

Я хочу изменитьзапрос таким образом, что когда Col1 повторяется, мне нужен новый столбец (Col4), чтобы идентифицировать разницу, как показано ниже, путем добавления дополнительного числа последовательно к существующему значению в Col1. Это может быть до 5, поскольку у меня будет пять значений разницы в столбце 2.

Результат будет таким, как показано ниже. Это возможно?

Col1  |Col2  |Col3 |Col4  
------+------+-----+------
111   |1     |23   | 111
111   |2     |21   |1111
112   |1     |11   | 112
112   |2     |13   |1121
112   |3     |12   |1122
113   |1     |4    | 113
113   |2     |4    |1131
113   |3     |4    |1132

Я пытаюсь получить данные с одним основным идентификатором, имеющим несколько записей в запросе результата

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Если ваши значения col2 не являются последовательными, вы можете достичь желаемого результата, используя row_number():

select results.*, 
       concat(col1, case when row_number() over (partition by col1 order by col2) = 1 then ''
                         else cast(row_number() over (partition by col1 order by col2) - 1 as char)
                    end) as col4
from results

Выход:

col1    col2    col3    col4
111     1       23      111
111     2       23      1111                             
112     1       11      112
112     2       13      1121                             
112     3       12      1122                             
113     1       4       113
113     2       4       1131                             
113     3       4       1132 

Демонстрацияна dbfiddle

0 голосов
/ 21 октября 2019

ROW_NUMBER() можно использовать для нумерации строк ... вам просто нужно обработать номер строки = 1:

SELECT Col1
     , Col2
     , Col3
     , Col4 = CONCAT(Col1, NULLIF(ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2) - 1, 0))
FROM t

Демонстрация на db <> fiddle

0 голосов
/ 21 октября 2019

Это выглядит как concat() с арифметикой:

select t.*,
       concat(col1,
              (case when col2 = 1 then '' else col2 - 1 end)
             ) as col4
from t;
...