Объединение двух таблиц с дубликатами, присвоенными определенному значению в mssql - PullRequest
0 голосов
/ 27 июня 2019

У меня есть две таблицы, Таблица-1:

     col4  col5                                                                                                                  
0    Tom    20                                                                                                                   
1   nick    21                                                                                                                   
2  krish    19                                                                                                                   
3   jack    18

Таблица-2:

   col1   col2  col3                                                                                                              
0  xxx    Tom    110                                                                                                              
1  yyy   nick    121                                                                                                              
2  zzz  krish    119                                                                                                              
3  xxx   jack    118                                                                                                              
4  yyy    Tom    141                                                                                                              
5  xxx   nick    156                                                                                                              
6  yyy  krish    176                                                                                                              
7  zzz   jack    186

Мне нужно иметь col5 в моей таблице 2 на основе col2 и col4. Значение col5 для повторяющихся значений в col2 должно быть присвоено 0, за исключением первого значения. Например, Tom повторяется, и только первое значение Tom (индекс 0) присваивается 20 после слияния с таблицей-1. Другое значение Tom должно быть 0 (индекс 4). Я хочу столбец результирующей таблицы как:

  col1   col2  col3  col5                                                                                                            
0  xxx    Tom   110   20                                                                                                           
1  yyy   nick   121   21                                                                                                          
2  zzz  krish   119   19                                                                                                           
3  xxx   jack   118   18                                                                                                           
4  yyy    Tom   141    0                                                                                                            
5  xxx   nick   156    0                                                                                                          
6  yyy  krish   176    0                                                                                                         
7  zzz   jack   186    0

Пожалуйста, помогите мне достичь этого. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Таблицы SQL представляют неупорядоченные наборы. Не существует «первой» строки, если в столбце не указан порядок.

Предполагая, что у вас есть такой столбец, вы можете просто использовать left join и row_number() следующим образом:

select t2.*,
       (case when row_number() over (partition by t2.col4 order by ?) = 1
             then t2.col5 else 0
        end) as col5
from table2 t2 left join
     table1 t1
     on t2.col4 = t1.col2;
0 голосов
/ 27 июня 2019

Прежде всего, обычно объедините две таблицы:

SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.col4=Table1.col2

Тогда результат ясен:

  col1   col2  col3  col5                                                                                                            
0  xxx    Tom   110   20                                                                                                           
1  yyy   nick   121   21                                                                                                          
2  zzz  krish   119   19                                                                                                           
3  xxx   jack   118   18                                                                                                           
4  yyy    Tom   141   20                                                                                                            
5  xxx   nick   156   21                                                                                                          
6  yyy  krish   176   19                                                                                                         
7  zzz   jack   186   18

После этого давайте добавим номер строки для каждого человека и выберем только первый:

SELECT t.col1,t.col2,t.col3, CASE WHEN t.Rn=1 THEN t.col5 ELSE 0 END col5
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY Table1.col4 ORDER BY Table2.Col1) Rn
FROM Table1
INNER JOIN Table2 ON Table1.col4=Table1.col2) t
...