根据特定列值删除重复项

时间:2018-04-02 23:03:41

标签: sql sql-server tsql sql-server-2012

我有一个表#temp,我需要根据列(Tariff_Value)值删除一些重复项。

下面是SQL小提琴,我填充了随机值。

CREATE TABLE #temp
(
[acctnumber] varchar(50),
[Premnumber] varchar(50),
x varchar(5),
y varchar(5),
z varchar(5),
w varchar(5),
[Tariff_value] varchar(50)
)

INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('3237329','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('3237329','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('6541835','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('6541835','234233','x','y','z','w','RATE 2Mdf SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('7545322','234233','x','y','z','w','RATE 8Msd SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('7545322','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('8548235','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('8548235','234233','x','y','z','w','RATE 5M12 PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('5482312','234233','x','y','z','w','RATE 5M6552 PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('5482312','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('7589631','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('7589631','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')

查询的输出应该是 multipart attachments

我需要一个查询,其中可以实现以下逻辑,或者如果可能的话,任何有效的CROSS APPLY逻辑都可以获得这些逻辑。

;WITH cte1 AS
(
SELECT [acctnumber], [Premnumber],x,y,z,w,count(*) AS cnt FROM #temp
GROUP BY [acctnumber], [Premnumber],x,y,z,w
)
,

SELECT a.* FROM #temp a INNER JOIN cte1 b ON a.acctnumber = b.acctnumber AND a.Premnumber = b.Premnumber
WHERE (if b.cnt >1 then FETCH record from #temp table exclude tarriff_value like '%2M%' and fetch tarriff_value like '%5M%'  )

问题:如果没有与之关联的5M记录,则输出查询不应排除2M记录。随后,它应从(2M和5M)记录中排除2M。

字面上的视觉解释

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为这样做会。没有使用交叉应用只是基本的左连接。

select * 
from #temp t
left join 
(select acctnumber, Tariff_value
from #temp
where Tariff_value like '% 2M %') t1
on t.acctnumber = t1.acctnumber 
and t.Tariff_value = t1.Tariff_value
left join 
(select acctnumber, Tariff_value
from #temp
where Tariff_value like '% 5M %') t2
on t1.acctnumber = t2.acctnumber 
where t2.acctnumber is null

答案 1 :(得分:1)

我使用指示器在5M时将记录标记为1,而对于2M则使用2。如果该指标的总和为3,那么它是5M和2M对。我使用join来对原始​​表进行过滤。看看sqlfiddle中的demo; http://sqlfiddle.com/#!18/a0754/6

select t.*
from temp t join (
select acctnumber,
sum(case when Tariff_value like '%5M%'
 then 1 
 when Tariff_value like '%2M%'
 then 2 else 0 end) as is_pair
from temp
group by acctnumber) s
on t.acctnumber=s.acctnumber
 where s.is_pair <> 3
  or (s.is_pair=3 
      and t.Tariff_value like '%5M%');