Проблемы с возвратом уникальных значений из двух таблиц с объединением и Row_Number в SQL - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь вернуть уникальные значения из одного поля «name» из двух таблиц, используя union и Row_number.

Мне нужно вернуть три столбца: ID, Caseid и Name, но только уникальные имена.Одно и то же имя появляется в View1 и Table2 несколько раз.

Идентификатор также уникален, поэтому я не могу использовать group by для достижения этой цели.

Ниже приведена моя попытка, которую я надеялся назначитьстрока № 1 к первому результату каждого имени, однако она не работает и выдает странные результаты, например, если есть два идентичных имени, она может дать номер строки 52. Другие результаты работают как целевые.

Сохранено как NewDistinctView

WITH cte1 AS 
(
SELECT  ID, Caseid, Title as Name
FROM           View1
UNION 
SELECT        ID, CaseID, Name as Name
FROM          Table2
WHERE        (Party = 'Yes')),
cte2 as (SELECT ID, Caseid, Name,  ROW_NUMBER() OVER (PARTITION BY Name ORDER BY ID DESC) AS rn
from cte1
)
SELECT       *
FROM         cte2
WHERE       rn = 1

Table2

    ID      CASEID         NAME       PARTY  
 -------- ----------- -------------- ------- 
  116524   486628439   Fiona T        No     
  116525   486628439   DTZ Holdings   Yes    
  384221   486628439   Clare S        Yes    
  384222   486628439   David S        YES    
  384223   486628439   Andrew P       YES   

View1

  ID     CASEID        TITLE      
 ----- ----------- -------------- 
  591   486628439   DTZ Holdings  
  594   486628439   DTZ Holdings  
  592   486628439   Clare S       
  593   486628439   David S       
  595   486628439   David S       
  584   486628439   John B        
  585   486628439   John B        
  586   486628439   Anna A        
  587   486628439   Peter D       
  588   486628439   Peter D       
  589   486628439   Peter D       
  590   486628439   Peter D  

Результаты, когда «где rn = 1» изменяется на «rn> 0», чтобы показать все rn

с * рядом с ошибочными результатами

    ID      CASEID         NAME       RN  
 -------- ----------- -------------- ---- 
     592   486628439   Clare S        52*  
     593   486628439   David S         8*  
     584   486628439   John B          2  
     589   486628439   Peter D         2  
  384221   486628439   Clare S         1  
  384222   486628439   David S         1  
  116525   486628439   DTZ Holdings    3  
     586   486628439   Anna A          1  
     588   486628439   Peter D         3  
  384223   486628439   Andrew P        1  
     595   486628439   David S         7*  
     591   486628439   DTZ Holdings    5*  
     585   486628439   John B          1  
     590   486628439   Peter D         1  
     594   486628439   DTZ Holdings    4  
     587   486628439   Peter D         4  

If, гдеrn = 1 "используется для отображения уникальных результатов, тогда Clare S не отображается, но rn по-прежнему не работает должным образом.

Буду признателен за любые мысли о том, как я могу добиться этого в качестве поправки нижеили другим способом?Я использую SQL Server 2016.

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 мая 2018

Предполагая, что ID является первичным ключом, даже после объединения двух таблиц, это должно работать:

SELECT A.ID, A.CaseID, A.Name
FROM cte1 A
JOIN (SELECT Name, MAX(ID) AS ID
    FROM cte1
    GROUP BY Name) B
ON A.ID = B.ID
...