我需要通过符合条件的行执行一个组,否则返回所有不满足条件的行。例如,在下表中,我想只对“active”字段中具有'1'的行进行分组,并返回所有没有的行。按值删除重复的行
表(ID,标签,有源):
1, A, 1
2, A, 1
3, B, 0
4, B, 0
将返回:
1, A, 1
3, B, 0
4, B, 0
我需要通过符合条件的行执行一个组,否则返回所有不满足条件的行。例如,在下表中,我想只对“active”字段中具有'1'的行进行分组,并返回所有没有的行。按值删除重复的行
表(ID,标签,有源):
1, A, 1
2, A, 1
3, B, 0
4, B, 0
将返回:
1, A, 1
3, B, 0
4, B, 0
这是我能想到的最简单的方法。这是小组的一个案例陈述。如果条件满足,则按标签分组,否则按主键分组。
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
编辑:我误解你想在组的字段。现在更正。
当我的答案如此简单时,我喜欢它我很尴尬我没有想到它。 – scader 2010-01-30 15:44:35
你可以使用一个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服务器,所以这是完全未经测试的。
因此... 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
是新的资源密集型? – scader 2010-01-30 14:11:14
我更喜欢我的方法,因为没有子查询并重新调整id字段,因为case语句中的唯一选项减少了几个函数调用。 但是,如果与这一个去,我认为你必须从GROUP BY子句中删除id列。否则,它将返回没有分组的所有行。 – 2010-01-30 14:24:00
也许查询的布局可能是这样的:
这是一个很模糊的问题。等待重要大小的更新。 – 2010-01-30 13:53:29
其中是example .. – Amirshk 2010-01-30 13:54:50