Sql 为每个组选择N个项目?

Sql 为每个组选择N个项目?,sql,sql-server,Sql,Sql Server,我有桌子: Category: Id, Name... News: Id, Title News_Category_Mapping: Id, NewsId, CategoryId 其中newsid、categoryid是这两个表的外键 新闻\类别\映射: Id NewsID CategoryId 1 1 1 2 2 1 3 3 1 4 4 3 5 5 5 6 6

我有桌子:

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

News_Category_Mapping:  Id, NewsId, CategoryId
其中newsid、categoryid是这两个表的外键

新闻\类别\映射:

Id  NewsID CategoryId
1     1        1
2     2        1
3     3        1
4     4        3 
5     5        5
6     6        3
所以我可能想从每个分类中最多获得2条新闻,比如

Id  NewsID CategoryId
1     1        1
2     2        1
4     5        3
6     6        3
5     5        5
对不起,我的英语不好。

试试这个:

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选择记录。要了解查询是如何工作的,请先执行内部查询。

假设每个查询需要2项

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

以下是您可以使用交叉应用的

,如下所示:

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

这是一个用于此的

任意2个?或者由某个客户订购?什么版本的SQL Server?如果是2008年,请使用RANK函数。care提供有关表的更多信息,即所有列及其数据类型,类似于所需的输出和您迄今为止尝试的内容抱歉,在链接完成执行之前复制了链接,现在已修复,感谢提醒。