选择前N个类别中的所有项目

时间:2014-08-17 20:43:14

标签: sql

有人可以建议如何为MS sql server编写sql查询,从以下场景中选择前N个类别中的所有项目吗?

类别表

|idCtegory|strName
------------------
|1        |cat 1
|2        |cat 2
|3        |cat 3
|4        |cat 4

项目表

|idItem|idCategory
------------------
|1     |1
|2     |1
|3     |3
|4     |2

让我们说我想从前2个类别中选择所有项目,因此我希望得到类似的内容

|idItem|idCategory
------------------
|1     |1
|2     |1
|4     |2

我试图加入这些表格,但后来我不知道确切的项目数量。

由于

编辑: 我只是想加入select top(N) idCategory FROM categories group by idCategory的项目表,我希望它能起作用。

2 个答案:

答案 0 :(得分:1)

如果你不想保持联系:

with tops as
 (select top 2 i.idcategory, count(*) as num_items
    from items i
   group by i.idcategory
   order by num_items desc)
select i.* from items i join tops t on i.idcategory = t.idcategory

小提琴: http://sqlfiddle.com/#!6/3bebb/7/0

如果你想保持联系:

with tops as
 (select top 2 with ties i.idcategory, count(*) as num_items
    from items i
   group by i.idcategory
   order by num_items desc)
select i.* from items i join tops t on i.idcategory = t.idcategory

小提琴: http://sqlfiddle.com/#!6/3bebb/8/0(请注意类别2和3是如何回归的,因为它们各自相关;它们都只有一个项目)

你的预期输出表明你不关心关系,但我想我会指出它以防万一你确实这样做。

答案 1 :(得分:0)

如果通过"顶级类别"你的意思是那些项目最多的你可以使用row_number()和聚合:

select iditem, id
from (select idcategory, count(*) as cnt, row_number() over (order by count(*) desc) as seqnum
      from items
      group by idcategory
     ) c join
     items i
     on c.idcategory = i.idcategory
where segnum <= 1;