我有一个数据集:
Group Owner
ABC John
ABC
TTT
TTT
TTT
CBS Alen
CBS Tim
SGD
SGD
现在我需要搜索数据集以查找其所有者全部为空的所有行,例如TTT和SGD(不是ABC,因为它有一个所有者为John的行)。但我只需要选择一个项目而不是全部(第一个更好)。我怎么能用c#?
来做到这一点答案 0 :(得分:0)
由于您尚未指定数据库,我将在sqlfiddle.com
中使用MySQL5.6,但该方法很可能在任何关系数据库中都相似。
首先,让我们设置架构:
create table x (grp varchar(10), ownr varchar(10), row int);
insert into x (grp, ownr, row) values ('abc', 'john', 1);
insert into x (grp, ownr, row) values ('abc', '', 2);
insert into x (grp, ownr, row) values ('ttt', '', 3);
insert into x (grp, ownr, row) values ('ttt', '', 4);
insert into x (grp, ownr, row) values ('ttt', '', 5);
insert into x (grp, ownr, row) values ('cbs', 'alan', 6);
insert into x (grp, ownr, row) values ('cbs', 'tim', 7);
insert into x (grp, ownr, row) values ('sgd', '', 8);
insert into x (grp, ownr, row) values ('sgd', '', 9);
第一步是获取输出中不想要的组列表。对此的查询将是:
select distinct grp from x where ownr <> ''
grp
---
abc
cbs
那么你只需要一个包含其他组的行,而不是那些(我也在这里按行排序):
select * from x where grp not in (
select distinct grp from x where ownr <> ''
) order by row
这会让你获得所有其他行:
grp ownr row
--- ---- ---
ttt 3
ttt 4
ttt 5
sgd 8
sgd 9
现在,它变得略微不清楚你想要什么。如果您只想要整个集合中的第一个,您可以简单地使用限制条款,例如:
select * from x where grp not in (
select distinct grp from x where ownr <> ''
) order by row limit 1
grp ownr row
--- ---- ---
ttt 3
但是,如果您需要每个组的第一个,则可以使用聚合子句完成,如下所示:
select grp, '' as ownr, min(row) as row
from x where grp not in (
select distinct grp from x where ownr <> ''
) group by grp
grp ownr row
--- ---- ---
sgd 8
ttt 3
显然我对以下事情做了一些假设:
但即使需要修改这些假设,一般方法仍应保持不变。