好的,这可能有点难,但我会尽力解释的。听我说..。
我有一个包含多列的表,如下所示。
ITEM_ID - GROUP_ID
1-空
2-空
3-空
4-3
5-3
6-3
7- 21
8-6
9- 21
10 - 21
11 - 21
12 -4
13 -4
15 -6
16 -6
17 -6
19 -3
我想进入这个表并返回一个列表,如下所示:
1.)每一项都是独立的。
2.)每个项目都按组ID分组。
3.)结果被限制为总共5个组,每个空的项目被算作一个唯一的组。
4.)当返回一个组时,会返回所有具有相同组号的对象。
在这个例子中,我想返回:
1-空
2-空
3-空
4-3
5-3
6-3
19 -3
7- 21
9- 21
10 - 21
11 - 21
因此,项目1、2和3分别计为1个返回组,总共3个返回组。项目4、5、6和19都是组3,并计入一个退回组,使我们的总数达到4个组。项目7、9、10和11都是组21,并计入一个退回组,使我们的退回组总数达到5个,此时不再有组或单个项目(计为组)被退回。
我通常对SQL很在行,但这一点我完全搞不懂。
谢谢大家!
发布于 2010-03-24 03:07:24
这将返回您所请求的内容。内部子查询简单地过滤空值并分配一个唯一的“键”(一个负的id号)。它们被“限制”到前五个唯一的组ids,然后对子查询的一个副本进行联接,以返回我们需要的记录。然后,使用外部的子查询以请求的方式打印结果集。
select a.item_id, case when a.group_id <= 0 then null else a.group_id end group_id
from (
select distinct group_id, item_id from test.so_test where group_id is not null
union
(select -item_id, item_id from test.so_test where group_id is null)
) a inner join (
select distinct group_id from test.so_test where group_id is not null
union
(select -item_id from test.so_test where group_id is null)
order by group_id limit 0, 5
) b on a.group_id = b.group_id
order by case when a.group_id <= 0 then null else a.group_id end, a.item_id;https://stackoverflow.com/questions/2500568
复制相似问题