Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server加入最新的2个条目_Sql_Sql Server_Greatest N Per Group - Fatal编程技术网

SQL Server加入最新的2个条目

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

我知道这篇文章的标题不好,但请听我说完。前几天在工作中出现了这样一个问题,虽然我找到了解决办法,但这个问题仍然困扰着我

假设Stackoverflow只有3个表

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