ВЫБЕРИТЕ ТОП (N) строк для каждой группы - PullRequest
2 голосов
/ 19 октября 2011

Вот мой запрос:

SELECT [Id], [HotelName], [StarRating], [Description], [CheckinDate], [CheckoutDate], [Price], [ImageUrl]
FROM
(
    SELECT TOP (6) [Id], [HotelName], [StarRating], [Description], [CheckinDate], [CheckoutDate], [Price], [ImageUrl], RANK() OVER(PARTITION BY [StarRating] ORDER BY [StarRating]) AS Num
    FROM [dbo].[Hotel]
    WHERE [CityId] = @CityId 
    AND CheckinDate > GETDATE()
    AND [StarRating] IN (3, 4, 5)
) X
WHERE Num <= 2

Я хочу получить 2 строки для каждой звездной оценки: 2 из рейтинга 3, 2 из рейтинга 4 и 2 из рейтинга 5. Как я могу это сделать? Я придумал вышеупомянутое после того, как уже провел некоторые онлайн-исследования, но, очевидно, я не совсем понимаю, как его реализовать, потому что он не работает ... Я получаю 6 рядов звездного рейтинга 3

1 Ответ

8 голосов
/ 19 октября 2011

Используйте функцию ROW_NUMBER - например,

WITH X 
AS
(
    SELECT 
       [Id], [HotelName], [StarRating], [Description], 
       [CheckinDate], [CheckoutDate], [Price], [ImageUrl], 
       ROW_NUMBER() OVER(PARTITION BY [StarRating] ORDER BY [Id]) AS Num
    FROM 
       [dbo].[Hotel]
    WHERE 
       [CityId] = @CityId 
         AND CheckinDate > GETDATE()
         AND [StarRating] IN (3, 4, 5)
) 
SELECT 
   [Id], [HotelName], [StarRating], [Description], 
   [CheckinDate], [CheckoutDate], [Price], [ImageUrl]
FROM 
   X
WHERE 
   Num <= 2
...