2012-02-11 3 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| 

Как я могу создать этот запрос? Я решил эту проблему раньше, просто возвращая последний комментарий и даже не пытаясь получить вторую, и мальчик, позвольте мне сказать вам, что это было ВЕСЬ намного больше, чем когда я думал с подзапросами, TOP и другими странными динамиками в базе данных ,

Bonus Round Почему некоторые запросы, которые кажутся легкими логически, оказываются чудовищными, по крайней мере, с точки зрения новичков?

EDIT: Я использовал сервер MS SQL.

+0

FYI, только один вопрос на вопрос здесь. –

+0

В теге ['наибольшая n-на-группу'] (http://stackoverflow.com/questions/tagged/greatest-n-per-group) есть много похожих вопросов. Вы следуете этой ссылке или ссылкам под заголовком ** Related **, справа. –

+0

Это может помочь, если вы также включили используемую СУБД. –

ответ

3

Вы можете использовать перекрестный поворот запроса на 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

Спасибо Мартин. Очевидно, что мне нужно будет сделать тяжелое чтение, если я хочу получить более мощные запросы. –

+0

@FlexFiend - Все, что написано Itzik Ben Gan, стоит прочитать. –

+0

Спасибо, что научили меня ловить рыбу. Я собираюсь ознакомиться с приобретением одной из этих книг и чтением его веб-сайта. –