按值删除重复的行

时间:2010-01-30 13:46:22

标签: sql

我需要执行group by,但仅限于满足条件的行,否则返回所有不符合条件的行。例如,在下表中,我只想对“active”字段中包含“1”的行进行分组,并返回所有不包含“1”的行。

TABLE(id,label,active):

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

会回来:

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

3 个答案:

答案 0 :(得分:3)

这是我能想到的最简单的方法。这是该组中的案例陈述。如果满足条件,则按标签分组,否则按主键分组。

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
编辑:我误解了你要分组的字段。现已更正。

答案 1 :(得分:0)

您可以使用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

这将为符合条件的所有行(active = 1)提供一个公共值,为所有其他行提供一个唯一值,以便它们保持未组合状态。

我目前无法访问SQL服务器,所以这是完全未经测试的。

答案 2 :(得分:0)

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

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

union

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