SQL Server加入最新的2个条目
我知道这篇文章的标题不好,但请听我说完。前几天在工作中出现了这样一个问题,虽然我找到了解决办法,但这个问题仍然困扰着我 假设Stackoverflow只有3个表SQL Server加入最新的2个条目,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我知道这篇文章的标题不好,但请听我说完。前几天在工作中出现了这样一个问题,虽然我找到了解决办法,但这个问题仍然困扰着我 假设Stackoverflow只有3个表 Users ( username ) Comments ( comment, creationdate ) UsersCommentsJoin , this is the join table between the first 2 tables. 现在让我们假设我想做一个查询,它将返回最近2条评论的所有用户。所以结果集是这样的 |u
Users ( username )
Comments ( comment, creationdate )
UsersCommentsJoin , this is the join table between the first 2 tables.
现在让我们假设我想做一个查询,它将返回最近2条评论的所有用户。所以结果集是这样的
|username| most recent comment | second most recent comment|
我究竟该如何创建这个查询?我解决这个问题之前只是简单地返回最近的评论,甚至没有试图得到第二个,男孩,让我告诉你,它似乎比我想象的子选择,顶部和其他奇怪的DB杂技更复杂
为什么有些逻辑上看起来很简单的查询最终会变成怪物查询,至少从我的新手的角度来看是这样
编辑:我使用的是MS SQL server。您可以使用以数据为中心的交叉表查询
仅供参考,这里每个问题只有一个问题。标签上有许多类似的问题。您可以查看该链接或右侧相关标题下的链接。如果您还包括您正在使用的DBMS,可能会有所帮助。@ypercube问题是我不知道我的问题在数据库术语中被称为“greaterst-n-per-group”。@是的,我猜也是这样,这就是我添加它的原因:。这是一个常见的问题,很难解决。[best-n-per-group]标记在SO中使用,不知道它是否也在其他地方使用。谢谢Martin。很明显,如果我想进入更强大的查询,我将不得不做一些大量的阅读。@flexfeend-伊兹克·本·甘写的任何东西都值得一读。谢谢你教我像他们说的那样钓鱼。我打算买一本这样的书,看看他的网站。
WITH UC
AS (SELECT UCJ.userId,
C.comment,
ROW_NUMBER() OVER (PARTITION BY userId
ORDER BY creationdate DESC) RN
FROM UsersCommentsJoin UCJ
JOIN Comments C
ON C.commentId = U.commentId)
SELECT username,
MAX(CASE
WHEN RN = 1 THEN comment
END) AS MostRecent,
MAX(CASE
WHEN RN = 2 THEN comment
END) AS SecondMostRecent
FROM Users U
JOIN UC
ON UC.userId = U.userId
WHERE UC.RN <= 2
GROUP BY UC.userId