2015-12-29 58 views
0

举个例子,如果有:中如何处理重复在SQL的UNION ALL SELECT语句

SELECT '[email protected]' AS Email, 2 AS Somenumber, 3 AS Number 
UNION ALL 
SELECT '[email protected]' AS Email, 2 AS Somenumber, 5 AS Number 
UNION ALL 
SELECT '[email protected]' AS Email, 1 AS Somenumber, 6 AS Number 

代替:

enter image description here

我想:

enter image description here

+1

我不明白这个问题。只是不要在“union all”中包含第一行。 –

+0

假设这是样本数据,您如何决定要保留哪些“重复”,“number = 3”还是“number = 5”? – HoneyBadger

+0

这一切都取决于电子邮件地址,我想只返回没有电子邮件重复的行 – Wicky

回答

0

它看起来像你在每个电子邮件后一行金正日。你可以这样做:

; with all_rows as 
     (
     ... your union query here ... 
     ) 
, with numbered_rows as 
     (
     select row_number() over (partition by email order by somenumber) as rn 
     ,  * 
     from all_rows 
     ) 
select email 
,  somenumber 
,  number 
from numbered_rows 
WHERE rn = 1 
0

通常当我需要解决这样的问题,我将与以上只是我的脑海Devart解决方案相同的方式 工作,但这里给出更好的执行计划的替代解决方案

select Email, max(Somenumber), max(Number) from (
SELECT '[email protected]' AS Email, 2 AS Somenumber, 3 AS Number 
UNION ALL 
SELECT '[email protected]' AS Email, 2 AS Somenumber, 5 AS Number 
UNION ALL 
SELECT '[email protected]' AS Email, 1 AS Somenumber, 6 AS Number 
) A 
group by Email 

enter image description here