每组前 N 个(MSSQL)[重复]

Posted

技术标签:

【中文标题】每组前 N 个(MSSQL)[重复]【英文标题】:Top-N per group (MSSQL) [duplicate] 【发布时间】:2020-08-25 02:20:20 【问题描述】:

我有 10k - 1m 件商品,这些商品由 product_idnamecategoryprice 字段描述。从每个类别中获取 10 种最昂贵商品的最快方法是什么?以前我检查了这个答案https://***.com/a/176985/9513268。 我的桌子:

-------------------------------------
|product_id| name | category| price |
-------------------------------------
|    1     |Phone | Gadgets | 599.99|
------------------------------------
|    2     |Jacket| Clothes | 399.00|
------------------------------------- 
|   ...    | ...  |   ...   | ...   |
------------------------------------- 

【问题讨论】:

那么那里的答案有什么问题?为什么你的尝试没有成功?这感觉就像是那个问题的重复。 @Larnu 我想也许有更快的方法来完成任务。 考虑到您接受的答案与您链接的答案相同,我已将其作为上述答案的副本关闭。 【参考方案1】:

您可以使用窗口函数,如您链接的答案所示。

select *
from (
    select t.*, rank() over(partition by category order by price desc) rn
    from mytable t
) t
where rn <= 10
order by category, rn

关键是要正确定义窗口函数的over()子句。您想要category 的前 10 名,所以此列转到partition by;您想要最昂贵的商品,因此order by 的标准按降序排列price

您可以单独运行子查询并盯着rn 列以更好地理解逻辑。

【讨论】:

以上是关于每组前 N 个(MSSQL)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent/DB 选择每组前 1 行

mysql每组前N条

优化获取每组前 n 条记录的方法

MySQL 分组后取每组前N条数据

获取每组的前 n 个结果 [重复]

Pandas每组中的前n个值[重复]