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提供有关表的更多信息,即所有列及其数据类型,类似于所需的输出和您迄今为止尝试的内容抱歉,在链接完成执行之前复制了链接,现在已修复,感谢提醒。