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
相关产品推荐
相关产品推荐

