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

时间:2013-09-17 17:28:52

标签: 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

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

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

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

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

使用MS SQL 2005

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

3 个答案:

答案 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。哈,愚蠢的错误我会责怪阅读障碍。现在纠正了)