每组前 N 个 (MSSQL)
Top-N per group (MSSQL)
我有 10k - 1m 的商品,它们由字段 product_id
、name
、category
、price
描述。从每个类别中取出 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
列以更好地理解逻辑。
我有 10k - 1m 的商品,它们由字段 product_id
、name
、category
、price
描述。从每个类别中取出 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
列以更好地理解逻辑。