【问题标题】:Deleting duplicates in MSSQL [duplicate]删除 MSSQL 中的重复项 [重复]
【发布时间】:2013-07-09 11:00:06
【问题描述】:

在 MSSQL TABLE 中,我有 3 列。

ID (IDENTITY), KeptValue(NVARCHAR), SPENT(MONEY).

我有多个重复的KeptValues。我需要删除所有重复项并保留 1 个。但我需要保留花费最多的那个。
我创建了 2 个视图。重复的保留值列表VW_DUPLICATE1

【问题讨论】:

    标签: sql sql-server duplicates sql-delete


    【解决方案1】:
    delete t1
    from your_table t1
    left join  
    (
       select keptvalue, max(spent) as mSpent
       from your_table
       group by keptvalue
    
    ) t2 on t1.keptvalue = t2.keptvalue and t1.spent = t2.mSpent
    where t2.mSpent is null
    

    【讨论】:

    • id is not 在 group by 它抛出错误“列 'id' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中”
    • @bvr:当然。我错过了。谢谢。
    【解决方案2】:

    您可以使用此查询删除特定的KepValue,保持最高的SPENT

    DELETE FROM your_table WHERE SPENT < (SELECT MAX(SPENT) FROM your_table WHERE KeptValue='your_value') AND KeptValue='your_value'
    

    【讨论】:

      【解决方案3】:

      试试这个

      DELETE FROM tbl WHERE Id IN (
          SELECT Id FROM (
              SELECT 
                  Id
                  ,ROW_NUMBER() OVER (PARTITION BY KeptValue ORDER BY SPENT DESC) AS [ItemNumber]
              FROM 
                  tbl
          ) a WHERE ItemNumber > 1 
      )
      

      【讨论】:

      • @Julian Michael Mostert 试试这个它会给你的 req 输出
      【解决方案4】:

      试试这个

      Create table #temp ( ID int, KeptValue NVARCHAR(20) , SPENT numeric(18,3))
      
      INSERT INTO #temp select 1,'KeptValue1', 20
      INSERT INTO #temp select 2,'KeptValue1', 21
      INSERT INTO #temp select 3,'KeptValue2', 22
      INSERT INTO #temp select 4,'KeptValue2', 20
      INSERT INTO #temp select 5,'KeptValue2', 20
      INSERT INTO #temp select 6,'KeptValue3', 20
      INSERT INTO #temp select 7,'KeptValue3', 23
      INSERT INTO #temp select 8,'KeptValue3', 24
      INSERT INTO #temp select 9,'KeptValue4', 28
      INSERT INTO #temp select 10,'KeptValue4', 23
      INSERT INTO #temp select 11,'KeptValue5', 24
      INSERT INTO #temp select 12,'KeptValue6', 28
      
      select * FROM #temp 
      
      DELETE 
      FROM #temp 
      WHERE ID 
      in(
          select ID from  
                          (SELECT Id, (ROW_NUMBER() OVER(PARTITION BY KeptValue order by SPENT desc)) as R 
                          from #temp
                          ) as RowsNm
          WHERE R >1)
      
      select * from #temp 
      
      
      drop table #temp 
      

      【讨论】:

        【解决方案5】:

        您可以通过在 Spent 上执行 group by KeptValue 和 max 聚合来实现这一目标

        【讨论】:

        • 我认为他的意思是删除重复项,而不仅仅是使用Group By 忽略它们。
        • 谢谢,是的,也许我没有说清楚。很高兴知道您为什么会被否决,这样您下次就可以学习了!
        猜你喜欢
        • 1970-01-01
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多