【问题标题】:Duplicates removing [duplicate]重复删除[重复]
【发布时间】:2011-09-16 16:21:01
【问题描述】:

可能重复:
Delete duplicate records from a SQL table without a primary key

我有数据:

SELECT
          a
        , b
    FROM 
    (
        select a = 1, b = 30
        union all 
        select a = 2, b = 50
        union all 
        select a = 3, b = 50
        union all 
        select a = 4, b = 50
        union all 
        select a = 5, b = 60
    ) t

我必须得到输出(下一个(按a排序)重复记录应从结果集中排除):

a           b
----------- -----------
1           30
2           50
3           50  -- should be excluded
4           50  -- should be excluded
5           60

【问题讨论】:

  • 所以问题比select min(a), b from ... group by b复杂? -- 因为这将适用于您的示例数据
  • @antlersoft 已经足够好了。我有:a 是 int,b 是 uniqueidentifier,所以它也可以工作。谢谢。

标签: tsql sql-server-2008 duplicate-removal


【解决方案1】:
SELECT
          min(a) as a
        , b
    FROM 
    (
        select a = 1, b = 30
        union all 
        select a = 2, b = 50
        union all 
        select a = 3, b = 50
        union all 
        select a = 4, b = 50
        union all 
        select a = 5, b = 60
    ) t
GROUP BY b    
ORDER BY a

【讨论】:

  • 如果 a 有一个非数字条目怎么办?
  • @P.R - 你应该仍然可以使用min()
  • 它崩溃并说它无法转换为数字(我在 MS 上试过)
  • @P.R - 你使用了什么数据类型?你测试了什么?对于列中的所有值,您必须具有相同的数据类型。
【解决方案2】:

在 oracle 中,我可以使用 group by 子句来做到这一点,你应该也能做到这一点。

select min(a), b
 from (select 1 a, 30 b
        from dual
      union all
      select 2 a, 50 b
        from dual
      union all
      select 3 a, 50 b
        from dual
      union all
      select 4 a, 50 b
        from dual
      union all
      select 5 a, 60 b from dual)
group by b;

编辑:看起来其他人想出了一个 MS sql 解决方案,不过我将把它留在这里以供后代使用。

【讨论】:

    【解决方案3】:

    最简单的方法是使用简单的GROUP BY

    SELECT
          a
        , b
    INTO #tmp
    FROM
    
    (
        select a = 1, b = 30
        union all 
        select a = 2, b = 50
        union all 
        select a = 3, b = 50
        union all 
        select a = 4, b = 50
        union all 
        select a = 5, b = 60
    ) t
    
    
    SELECT DISTINCT MIN(a) AS a,b
    FROM #tmp
    GROUP BY b
    ORDER BY a
    

    【讨论】:

    • 当您按 b 分组并在 a 上使用聚合时,不同的不会做任何事情,每一行都已经被证明是不同的。
    猜你喜欢
    • 2016-07-08
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2011-05-14
    相关资源
    最近更新 更多