You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Polars语法重写指定SQL查询并解决分组排名问题

Polars 并列排名的最优实现

如果你的需求是实现类似SQL中DENSE_RANK()或RANK()的并列排名逻辑(比如让Customer B的三项相同数据获得同一排名),Polars里最简洁高效的写法是使用内置的rank()方法配合窗口函数:

实现代码

假设你的数据按Customer分组,对Amount字段进行排名:

  • 若需要密集排名(相同值同排名,后续名次不跳号),对应SQL的DENSE_RANK():
import polars as pl

result = df.with_columns(
    pl.col("Amount")
    .rank(method="dense")
    .over("Customer")
    .alias("Rank")
)
  • 若需要标准排名(相同值同排名,后续名次跳号),对应SQL的RANK():
result = df.with_columns(
    pl.col("Amount")
    .rank(method="min")
    .over("Customer")
    .alias("Rank")
)

为什么这是最优写法

  1. 性能最优:rank()是Polars底层优化的矢量化操作,比任何手动实现的分组排名逻辑(比如用sort()+cumcount()自定义)都要高效,大数据量下差距尤为明显。
  2. 语义明确:通过method参数直接指定排名规则,代码可读性强,无需额外注释就能理解逻辑。
  3. 贴合SQL/Pandas逻辑:完美对应你熟悉的SQL排名函数,以及Pandas中rank(method='dense')/rank(method='min')的行为,学习成本低。

关于你遇到的Customer B并列问题

之前的代码无法识别并列排名,大概率是使用了默认的method="average"(会给相同值分配平均排名,导致名次不是整数并列),或者窗口分组的范围有误。改用上述指定method的写法,就能精准实现你需要的并列排名效果。

内容的提问来源于stack exchange,提问作者AKtheAT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:32:06