为每个组选择N个项目?

时间:2014-05-09 10:39:24

标签: sql sql-server

我有桌子:

Category:  Id, Name...
News:   Id, Title

News_Category_Mapping:  Id, NewsId, CategoryId

其中newsid,categoryid是这两个表的外键。

News_category_mapping:

Id  NewsID CategoryId
1     1        1
2     2        1
3     3        1
4     4        3 
5     5        5
6     6        3

所以我可能希望从每个categoryid获得最多2个新闻项,比如说

Id  NewsID CategoryId
1     1        1
2     2        1
4     5        3
6     6        3
5     5        5

抱歉我的英文。

3 个答案:

答案 0 :(得分:1)

试试这个:

WITH CTE AS
(SELECT C.Id,N.Id,N.Title,RN=ROW_NUMBER() OVER (PARTITION BY NC.CategoryID ORDER BY NC.NewsId)
 FROM News_Category_Mapping NC JOIN
     News N ON NC.NewsId=N.Id JOIN
     Category C ON NC.CategoryId=C.Id)
SELECT * FROM CTE WHERE RN<3

<强>解释

这里,内部查询沿行号RN选择记录。要了解查询的工作原理,请先执行内部查询。

答案 1 :(得分:1)

假设您需要每件物品

Select *
From Category C
    CROSS APPLY (Select top 2  Id,CatId,NewsName  
                 From News Nw where Nw.CatId=C.Id) As N

以下是fiddle sample

答案 2 :(得分:0)

您可以使用CROSS APPLY,如下所示:

Select c.*, Sub.*
from
  Categories c cross apply
  (
    select top 2 
      * 
    from 
      News n 
    where 
    exists
    (
       select 1 
       from NewsCategories nc 
       where nc.CatId = c.id and n.id = nc.NewsId
    )
  ) Sub

这是

SQLFiddle
相关问题