2012-02-11 15 views
1

投稿のタイトルが悪いと私は知っています。先日、このような質問が起きました。周りに道が見えても、問題はまだ私を悩ませています。SQL Serverは最新の2つのエントリと結合します

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| 

どのように質問を作成するのですか?私はこの問題を早期に解決するには、単に最新のコメントを返すだけで、2番目のものを手に入れようとしても、少年は、私がサブセレクト、TOPなどの不思議なDBアクロバットで思っていたよりも、 。

ボーナスラウンドなぜ私のルーキーの視点から見ると、論理的に簡単なような質問は、モンスターのクエリになるのですか?

EDIT:MS SQLサーバーを使用していました。

+0

にピボットクロス集計クエリを使用することができます。 –

+0

['best-n-per-group'](http://stackoverflow.com/questions/tagged/greatest-n-per-group)タグには多くの類似の質問があります。あなたはそのリンクに従うか、** Related **の下のリンクをクリックしてください。 –

+0

使用しているDBMSも含まれている場合は、役立つかもしれません。 –

答えて

3

あなたはFYI、質問ごとに1つだけ質問ここROW_NUMBER

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 
+0

Martinに感謝します。私がもっと強力な質問に遭遇したいのであれば、私はいくつかの読書をしなければならないことは明らかです。 –

+0

@FlexFiend - Itzik Ben Ganによって書かれたものはどれも読む価値があります。 –

+0

彼らが言っているように "魚を教える"ことに感謝します。私はこれらの本の1つを入手し、彼のウェブサイトを読むことを見るつもりです。 –

関連する問題