以下是我的数据:
item_ID | group_ID | count_of_items_in_group
2|ABC|3
5|ABC|3
9|ABC|3
29|DEF|3
3|DEF|3
4|DEF|3
200|XYZ|2
300|XYZ|2
600|GHI|1
SQL Filddle: http://sqlfiddle.com/#!2/dfe09/1
对于每个组,我想将返回的item_ID的数量限制为最多2.我不关心返回哪两个。如果组少于2行,则只返回1行。
我不能为每个组写一个select top * 2并且联合选择因为我有几百个组。
我不知道从哪里开始,非常感谢你的帮助。
使用MS SQL 2005
(表格布局与示例中的完全一样,它是基于多个查询的视图)
答案 0 :(得分:5)
使用ROW_NUMBER()
功能:
SELECT *
FROM (select *,ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY item_id) as RowRank
from items_in_groups
)sub
WHERE RowRank <=2
演示:SQL Fiddle
ROW_NUMBER()
函数为每一行分配一个数字。 PARTITION BY
是可选的,但用于为该组中的每个值开始编号,即:如果您PARTITION BY group_id
,那么对于每个唯一group_id
值,编号将从1开始。{ {1}}当然用于定义计数应该如何进行,并且在ORDER BY
函数中是必需的。
答案 1 :(得分:3)
如何使用 ROW_NUMBER()枚举数据集的字段数,按每个group_id进行分区。
在那之后,当刚刚小于或等于2时才返回?或任何你想要的号码
SELECT * FROM
(
select item_id, group_id, count_of_items,
ROW_NUMBER() OVER(PARTITION BY group_id ORDER BY count_of_items DESC)
AS RN
from items_in_groups
) A
WHERE RN <= 2
以下是Sql Fiddle
答案 2 :(得分:1)
可以将此作为min和max select语句,将它们组合在一起并分组,以消除一行组将提供的任何重复
select item_id, group_id
from(
(select max(item_id) as item_id, group_id from table group by group_id) a
union all
(select min(item_id) as item_id, group_id from table group by group_id) b) qry
group by item_id,group_id
我确定不是最漂亮的,但它确实有效。通常最好是内置某种类型的逻辑,而不是“我不关心返回哪两种。”
(编辑 - 我把groupID放在groupo中而不是item_ID。哈,愚蠢的错误我会责怪阅读障碍。现在纠正了)