Присоединение к SQL Server с последними 2 записями - PullRequest
1 голос
/ 11 февраля 2012

Я знаю, что название поста плохое, но выслушай меня. Подобный вопрос возник на днях на работе, и хотя я нашел способ обойти это, проблема все еще преследует меня.

Предположим, в 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 и другой странной акробатикой БД .

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

РЕДАКТИРОВАТЬ: я использовал сервер MS SQL.

1 Ответ

3 голосов
/ 11 февраля 2012

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