【问题标题】:Remove duplicate rows by value按值删除重复行
【发布时间】:2012-09-07 02:21:58
【问题描述】:

我需要执行 group by,但只针对满足条件的行,否则返回所有不满足条件的行。例如,在下表中,我只想对“活动”字段中具有“1”的行进行分组,并返回所有没有的行。

表(id、标签、活动):

1, A, 1
2, A, 1
3, B, 0
4, B, 0

会返回:

1, A, 1
3, B, 0
4, B, 0

【问题讨论】:

  • 这是一个非常模糊的问题。等待重大更新。

标签: sql


【解决方案1】:

这是我能想到的最简单的方法。这是group by中的一个case语句。如果满足条件则按标签分组,否则按主键分组。

SELECT id, label, active
FROM table
GROUP BY
  CASE
    WHEN active = 1 THEN active
    ELSE id END

如果要按活动和标签分组:

SELECT id, label, active
FROM table
GROUP BY
  CASE
    WHEN active = 1 THEN active
    ELSE id END,
  label

编辑:我误解了您要分组的字段。现已更正。

【讨论】:

  • 我喜欢它的答案如此简单,以至于我很尴尬我没有想到它。
【解决方案2】:

也许查询的布局可能是这样的:

select
  min(id),
  label,
  max(active)
from
  Foo
where
  active = 1
group by
  label

union

select
  id,
  label,
  active
from
  Foo
where
  active = 0

【讨论】:

    【解决方案3】:

    您可以使用 CASE 语句

    select min(id) as id, label, active
    from (
         select id, label, active,
               case
                 when active = 1 then 'active'
                 else convert(varchar,newid()) as discriminator
               end
         from table) t
    group by label, active, discriminator
    

    这将为满足条件(活动 = 1)的所有行提供一个公共值,并为所有其他行提供一个唯一值,以便它们保持未分组状态。

    我目前无法访问 SQL Server,因此完全未经测试。

    【讨论】:

    • 所以... SELECT id, label, active, case when active = 1 then null else convert(varchar,newid()) end as groupit group by groupit 不幸的是,我将使用聚合函数还有很多其他字段也返回,但我想我可以先将原始数据分组为子选择,然后加入杂项数据。
    • 我更喜欢我的方法,因为没有子查询,并且将 id 字段重新用作 case 语句中的唯一选项可以减少几个函数调用。但是,如果使用这个,我认为您必须从 GROUP BY 子句中删除 id 列。否则它将返回所有没有分组的行。
    猜你喜欢
    • 2018-11-27
    • 2018-04-10
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2018-03-05
    • 2010-12-25
    相关资源
    最近更新 更多