sql - 为每个组选择前 (N) 行

标签 sql sql-server greatest-n-per-group

到目前为止,这是我的查询:

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 行:3 级中的 2 行,4 级中的 2 行和 5 级中的 2 行。我该怎么做?我已经在网上做了一些研究之后想出了以上内容,但我显然不完全理解如何实现它,因为它不起作用......我得到 6 行星级 3

最佳答案

使用 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

关于sql - 为每个组选择前 (N) 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816457/

相关文章:

sql - Postgres : Get value of a column corresponding to max of other column in a group

sql - 左加入 Group By

mysql - 如何将 MDB (Access) 文件转换为 MySQL(或纯 SQL 文件)?

php - 从三个表中进行 SQL SELECT,并在投票系统中进行排序

sql-server - 安装过程中出现 fatal error (0x80070643) SQL Server 管理工作室 : A valid destination folder for the install could not be determined

sql - 如何在 SQL 查询中向 SQL Server 列添加加一 (+1)

sql - 如何更正此 sql 分组查询? (我觉得这个是sql generic,我们用的是postgresql)

mysql - 无法从两个表中获取唯一值

sql - MySQL - NULL 值检查和存储过程中的动态 SQL

sql-server - SQL Server : Computed Column Result Used In Another Computed Column