【问题标题】:Remove duplicates based on specific column values根据特定列值删除重复项
【发布时间】:2018-04-03 08:05:10
【问题描述】:

我有一个表 #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')

查询的输出应该是

我需要一个可以实现以下逻辑的查询,或者任何有效的 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。

视觉上的解释

【问题讨论】:

  • 账户号码总是成对的吗?

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


【解决方案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

【讨论】:

    【解决方案2】:

    我使用指示器将记录标记为 5M 时为 1,而 2M 时为 2。如果该指标的总和为 3,则它是 5M 和 2M 对。我使用 join 对原始表进行过滤。参见 sqlfiddle 中的演示; 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%');
    

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2021-02-27
      • 1970-01-01
      • 2022-01-23
      • 2014-03-14
      相关资源
      最近更新 更多