我有一张如下所示的表格:comment_id,user_id,comment,last_updated。如何为每个用户获取5条最新评论(针对SQL Server的SQL查询)?
Comment_id在这里是关键。每个用户可能有多个评论。
如何为每个用户获取5条最新评论(针对SQL Server的SQL查询)?
输出应该与原始表相似,只是将用户的评论限制为每个用户最近的5个评论。
我有一张如下所示的表格:comment_id,user_id,comment,last_updated。如何为每个用户获取5条最新评论(针对SQL Server的SQL查询)?
Comment_id在这里是关键。每个用户可能有多个评论。
如何为每个用户获取5条最新评论(针对SQL Server的SQL查询)?
输出应该与原始表相似,只是将用户的评论限制为每个用户最近的5个评论。
至少SQL Server 2005的假设,因此您可以使用窗口函数(row_number)和CTE:
;with cteRowNumber as (
select comment_id, user_id, comment, last_updated, ROW_NUMBER() over (partition by user_id order by last_updated desc) as RowNum
from comments
)
select comment_id, user_id, comment, last_updated
from cteRowNumber
where RowNum <= 5
order by user_id, last_updated desc
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC
我认为应该这样做。
在2005年SQLSERVER,LIMIT无效。
相反,这样做:
SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY comment_id ASC
注意,这个假设COMMENT_ID单调增加,这可能并不总是对标识字段一个有效的假设(如果他们需要重新编号,例如)。你可能想考虑一个替代的领域,但基本结构将是相同的。
请注意,如果您是按日期字段排序,则需要按降序排序而不是升序排序,例如,
SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY last_updated DESC
乔的回答是在SQL Server中做到这一点的最佳方式(至少我认为是这样,我不熟悉的CTE)。但这里有一个使用标准SQL的解决方案(不是很快!):
SELECT * FROM comments c1
WHERE (SELECT COUNT(*) FROM comments c2
WHERE c2.user_id = c1.user_id AND c2.last_updated >= c1.updated) <= 5
它会给我1个用户的最新评论,对吧?每个用户需要5条最新评论。对于每个用户,“ – myforums 2011-01-11 19:58:17
”可能意味着他希望同时为所有*用户提供数据,而不仅仅是针对一个用户。 – dkarp 2011-01-11 19:59:00
wouldn; t返回**最老的(ASC)**一个用户**的评论?你不应该使用时间戳DESC? – Nishant 2011-01-11 19:59:02