每组前 N 个 (MSSQL)

Top-N per group (MSSQL)

我有 10k - 1m 的商品,它们由字段 product_idnamecategoryprice 描述。从每个类别中取出 10 件最昂贵的商品的最快方法是什么?之前我检查过这个答案。 我的 table:

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

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

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

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

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