2015-02-02 2 views
-2

Вот мой упрощенный макет базы данных в SQLServer:Находить последние несколько различных записей в SQLServer

Таблица Книги:

BookID BookName 
...... ......... 

Таблица Рецензенты:

ReviewerID ReviewerName 
.......... ............ 

Таблица Отзывы :

BookID ReviewerID ReviewDate Notes 
...... .......... .......... ..... 

Мне нужно узнать последние 3 «уникальные» книги, которые были рассмотрены. Например, если порядок проверки был book-a, book-b, book-c, book-c, book-d, выход должен быть book-d, book-c, and book-b.

Ни один из запросов, которые я пытался, кажется, работает. Внутреннее соединение, чтобы получить название книги, еще более усложняет его. Буду признателен за ваше руководство. С уважением.

+1

сообщение некоторые выборочные данные и запросы вы пытались –

+1

Как насчет размещения некоторых из этих неудачных запросов здесь? Возможно, необходимы лишь незначительные изменения. –

ответ

1

Я написал логику внутри запроса. Я также дал, как использовать (т. Е. JOIN) результат с вашими другими таблицами.

;WITH CTE AS 
(
    SELECT *, 
    -- Get sequence number for all dates for each BOOKID in descending order 
    ROW_NUMBER() OVER(PARTITION BY BOOKID ORDER BY REVIEWDATE DESC)RNO  
    FROM [Table Reviews] 
) 
SELECT TOP 3 TB.BOOKNAME,TR.ReviewerName [LastReviewedBy],C.ReviewDate [LastReviewDate] 
FROM CTE C 
JOIN [Table Books] TB ON C.BOOKID=TB.BOOKID 
JOIN [Table Reviewers] TR ON C.ReviewerID=TR.ReviewerID 
WHERE RNO=1 
ORDER BY DATEORDER DESC 
  • Click here для просмотра результата

РЕЗУЛЬТАТ

enter image description here

+0

Спасибо всем за вашу помощь. Отмечая это как ответ из-за глубины и деталей. – Peter

+0

Добро пожаловать. Не стесняйтесь спрашивать о любых изменениях. :) @Питер –

2

Это может быть достигнуто многими способами.

Вы можете дать ему попробовать с функцией ROW_NUMBER, например:

Не уверен, что это 100% правильно, попробуйте поставить sqlfiddles, поможет другим помочь вам.

select TOP 3 
    * 
from (
    select 
     ROW_NUMBER() OVER (
      PARTITION BY 
       BookID 
      ORDER BY 
       ReviewDate DESC 
     ) reviewOrder, 
     * 
    from Reviews 
) R 
where 
    reviewOrder = 1 
order by 
    ReviewDate DESC 
Смежные вопросы