Добавление значения из другого столбца при обнаружении дубликата - PullRequest
2 голосов
/ 16 мая 2019

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

Пожалуйста, смотрите ниже ожидаемый результат:

Column1     Column2   NewUniqueColumn
ABC          A      ABC
BCD          B      BCD
EFG          D      EFG
DEE          E      DEE
ABC          Z      ABC-Z
EFG          X      EFG-X

Я знаю, что одним из возможных решений является использование оператора case с предложением group by, как показано ниже

select
case when column 1 in 
 (select column1 from sampletable group by column1 having count(*) > 1)
then column1 +'-'+column2
else column1 end as NewUniqueColumn
from sampletable

Однако я надеялся, что можно найти лучшее решение этой проблемы, написав меньший код, что-то вроде

select column1+ column2 over (partition by column1 order by column1 ) from sampletable 

но я не могу понять, какую функцию я должен использовать для column1 + column2

1 Ответ

1 голос
/ 16 мая 2019

Я бы действительно рекомендовал , а не делать какие-либо DML для вашей текущей таблицы. В нем уже есть вся информация, необходимая для различения каждого «дубликата». Просто используйте ROW_NUMBER:

SELECT
    column1,
    column2,
    column1 + '-' + CONVERT(varchar(10),
        ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)) AS NewUniqueColumn
FROM sampletable;

Я предлагаю это, потому что ваша текущая парадигма снова ломается в случае, когда данное значение column1 имеет две или более записей с одинаковым значением column2.

Изменить:

Если вы действительно хотите дословный запрос для точного ожидаемого результата, попробуйте следующее:

SELECT
    column1,
    column2,
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) = 1
         THEN column1
         ELSE column1 + '-' + column2 END AS NewUniqueColumn
FROM sampletable;

enter image description here

Демо

...