5

这是我的数据的样子:

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 文件: http ://sqlfiddle.com/#!2/dfe09/1

对于每个组,我想将返回的 item_ID 的数量限制为最大 2。我不在乎返回哪 2 个。如果组少于 2 行,则仅返回 1 行。

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

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

使用 MS SQL 2005

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

4

3 回答 3

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 小提琴

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

于 2013-09-17T17:38:42.167 回答
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 小提琴

于 2013-09-17T17:37:58.573 回答
1

可以将其作为最小和最大选择语句来执行,将它们联合在一起并分组以消除一个行组将提供的任何重复项

 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

我敢肯定,这不是最漂亮的,但它确实有效。通常最好内置某种类型的逻辑,而不是“我不在乎返回哪个 2”。

(编辑 - 我将 groupID 放在 groupo by 而不是 item_ID 中。哈,愚蠢的错误我会归咎于阅读障碍。现在更正)

于 2013-09-17T17:38:03.307 回答