好的,所以这个可能很难,但我会尽力解释。忍受我......
我有一个包含多列的表格如下。
ITEM_ID - GROUP_ID
1 - null
2 - null
3 - null
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 - null
2 - null
3 - null
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非常好,但这个完全不适合我。
谢谢大家!!!
答案 0 :(得分:0)
这将返回您要求的内容。内部子查询只是过滤空值并分配唯一的“密钥”(负的ID号)。这些“限制”到前五个唯一的组ID,然后与子查询的副本连接以返回我们需要的记录。然后使用外部子查询以reuquested的方式打印结果集。
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;