SQL - 根据行数限制返回的行数

Aft*_*ess 5 sql sql-server sql-server-2005

这是我的数据:

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
Run Code Online (Sandbox Code Playgroud)

SQL Filddle: http ://sqlfiddle.com/#!2/dfe09/1

对于每个组,我想限制返回的item_ID的数量最多为2.我不关心返回哪两个.如果组少于2行,则只返回1行.

我不能为每个组写一个select top*2并且联合选择因为我有几百个组.

我不知道从哪里开始,非常感谢你的帮助.

使用MS SQL 2005

(表格布局与示例中的完全一样,它是基于多个查询的视图)

Har*_* CO 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
Run Code Online (Sandbox Code Playgroud)

演示:SQL小提琴

该  ROW_NUMBER() 函数为每一行分配一个数字. PARTITION BY 是可选的,但用于为该组中的每个值开始编号,即:如果您PARTITION BY group_id 然后为每个唯一group_id值编号将从1开始 ORDER BY,当然用于定义计数应该如何,并且在该ROW_NUMBER()功能.


Hec*_*hez 4

如何使用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
Run Code Online (Sandbox Code Playgroud)

这是Sql Fiddle