Как добавить новый столбец, который помечает дубликат столбца на основе значения другого столбца в SQL Server? - PullRequest
4 голосов
/ 17 мая 2019

Я пытаюсь изменить таблицу, добавив столбец, который может пометить все дубликаты Runner_Name на основе Track_Num.Я попытался использовать:

SELECT [Track_Num],
       ROW_NUMBER() OVER (PARTITION BY [Track_Num] ORDER BY [Runner_Name]) - 1 As Dup,
       [Runner_Name]
  FROM [runner]

, но он не работает, он просто упорядочивает Runner_Name

таблицу runner, которая выглядит следующим образом:

Track_Num     Runner_Name
   1            John
   1            John
   1            Jack
   2            Amy
   2            Mary
   2            John
   3            Josh
   3            Josh
   3            Taylor

Желаемая таблица, которую я надеюсь получить:

Track_Num     Runner_Name    Dup
   1            John          1
   1            John          1
   1            Jack          NULL
   2            Amy           NULL
   2            Mary          NULL
   2            John          NULL
   3            Josh          1
   3            Josh          1
   3            Taylor        NULL

Ответы [ 5 ]

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

Возможно просто обернуть оконную функцию в sign(nullif( ... ,1))

Пример

Select *
      ,Dup = sign(NullIf(sum(1) over (partition by  [Track_Num],[Runner_Name] ) ,1))
 From [runner]

Возвращает

Track_Num   Runner_Name Dup
1   Jack    NULL
1   John    1
1   John    1
2   Amy     NULL
2   John    NULL
2   Mary    NULL
3   Josh    1
3   Josh    1
3   Taylor  NULL
0 голосов
/ 17 мая 2019

Почему бы не выбрать пятый вариант?

SELECT *, dup=(select 1 from runner 
               where track_num=r.track_num and runner_name=r.runner_name 
               having count(*)>1)
FROM runner r

Этот подход работает без оконных функций или общих табличных выражений,

Смотрите демо здесь: https://rextester.com/WPLCLP17296

Вот демоверсия со значениями null - они не помечены как дубликаты: https://rextester.com/AND4821

0 голосов
/ 17 мая 2019

Используйте Common Table Expression для определения бегунов, имеющих дубликаты:

With cte_dups
As
(
    Select 
        r.Track_Num
        , r.Runner_Name
        , Count(*) As Track_Runner_Count
    From dbo.Runner As r
    Group By 
        r.Track_Num
        , r.Runner_Name
)
Select 
    r.Track_Num
    , r.Runner_Name
    , Iif(c.Track_Runner_Count > 1, 1, Null)
From dbo.Runner As r
    Left Outer Join cte_dups As c
        On c.Track_Num = r.Track_Num
        And c.Runner_Name = r.Runner_Name
0 голосов
/ 17 мая 2019

Сначала group by Track_Num, Runner_Name, чтобы получить количество каждой комбинации, а затем присоединиться к таблице:

select 
  r.Track_Num, 
  r.Runner_Name,
  case 
    when g.counter > 1 then 1
    else null
  end Dup 
from runner r inner join ( 
  select Track_Num, Runner_Name, Count(*) counter
  from runner
  group by Track_Num, Runner_Name
) g on g.Track_Num = r.Track_Num and g.Runner_Name = r.Runner_Name
0 голосов
/ 17 мая 2019

Если я правильно понимаю ваш вопрос, попробуйте это

select [Track_Num],
       [Runner_Name],
       Case when Count(1) > 1 then 1 else null end as Dup
from runner
group by [Track_num], [Runner_Name]
...