2010-01-30 81 views
2

我需要通过符合条件的行执行一个组,否则返回所有不满足条件的行。例如,在下表中,我想只对“active”字段中具有'1'的行进行分组,并返回所有没有的行。按值删除重复的行

表(ID,标签,有源):

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

将返回:

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

这是一个很模糊的问题。等待重要大小的更新。 – 2010-01-30 13:53:29

+0

其中是example .. – Amirshk 2010-01-30 13:54:50

回答

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 

编辑:我误解你想在组的字段。现在更正。

+0

当我的答案如此简单时,我喜欢它我很尴尬我没有想到它。 – scader 2010-01-30 15:44:35

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服务器,所以这是完全未经测试的。

+0

因此... SELECT id,label,active,case when active = 1 then null else convert(varchar,newid())end by groupit groupit 不幸的是,我将使用还会返回许多其他字段上的聚合函数,但我想我可以将原始数据首先分组为子选择,然后加入其他数据。 – scader 2010-01-30 14:06:06

+0

是新的资源密集型? – scader 2010-01-30 14:11:14

+0

我更喜欢我的方法,因为没有子查询并重新调整id字段,因为case语句中的唯一选项减少了几个函数调用。 但是,如果与这一个去,我认为你必须从GROUP BY子句中删除id列。否则,它将返回没有分组的所有行。 – 2010-01-30 14:24:00

0

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