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

SQL Server/Pandas按Category分区保LineItem顺序对PartNumber分组排名实现

解决方案

SQL Server 实现方案

你原有写法的问题是DENSE_RANK直接按PartNumber字段值排序,我们只需将排序依据替换为每个PartNumber在对应分类下首次出现的LineItem值即可实现需求,无需切换技术栈:

SELECT 
  Category,
  LineItem,
  PartNumber,
  DENSE_RANK() OVER (
    PARTITION BY Category 
    ORDER BY MIN(LineItem) OVER (PARTITION BY Category, PartNumber) ASC
  ) AS RankOrder
FROM [你的业务表名]

内层窗口函数MIN(LineItem) OVER (PARTITION BY Category, PartNumber)会计算每个分类下每个PartNumber首次出现的行号,外层按这个行号排序做密度排名,完全保留原始LineItem的顺序。

Pandas 实现方案

如果需要用Pandas实现,核心是用factorize方法关闭自动排序,按分组内PartNumber首次出现的顺序编码即可:

import pandas as pd

# 先确保数据按分类+行号顺序排列,避免原始数据顺序错乱
df = df.sort_values(by=['Category', 'LineItem']).reset_index(drop=True)

# 分组计算排名
df['RankOrder'] = df.groupby('Category')['PartNumber'].transform(
    lambda x: pd.factorize(x, sort=False)[0] + 1
)

其中sort=False是关键参数,保证不会按PartNumber的字典序重排,严格遵循LineItem的原始顺序。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:03