按ContractoreName与ProjectCode双分组,获取最大OrderID对应行的InvoiceID
嘿,这个需求我在日常工作里经常碰到,给你分享两种最常用场景的解决方案吧:
SQL 解决方案
不管你用的是MySQL、PostgreSQL还是SQL Server这类数据库,都有两种靠谱的实现方式:
方法1:子查询关联
先通过子查询算出每个ContractorName + ProjectCode分组下的最大OrderID,再和原表关联匹配,拿到对应的InvoiceID:
SELECT t1.ContractorName, t1.ProjectCode, t1.InvoiceID FROM your_table t1 INNER JOIN ( -- 先分组获取每个组的最大OrderID SELECT ContractorName, ProjectCode, MAX(OrderID) AS MaxOrderID FROM your_table GROUP BY ContractorName, ProjectCode ) t2 ON t1.ContractorName = t2.ContractorName AND t1.ProjectCode = t2.ProjectCode AND t1.OrderID = t2.MaxOrderID;
方法2:窗口函数(推荐,更简洁)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL等),用ROW_NUMBER()可以一步到位:
SELECT ContractorName, ProjectCode, InvoiceID FROM ( SELECT *, -- 按双字段分组,每组内按OrderID降序排,给行编号 ROW_NUMBER() OVER (PARTITION BY ContractorName, ProjectCode ORDER BY OrderID DESC) AS rn FROM your_table ) t WHERE rn = 1; -- 取每组的第一行(也就是OrderID最大的行)
⚠️ 注意:如果同一个分组里有多个行的OrderID都是最大值,上面的ROW_NUMBER()只会保留其中一行。如果要保留所有并列最大的行,把ROW_NUMBER()换成RANK()就行。
Python Pandas 解决方案
如果是用Pandas处理数据集,同样有两种直观的实现方式:
方法1:分组找最大值后合并
先分组算出每个组的最大OrderID,再和原数据框合并匹配:
import pandas as pd # 假设你的数据集存在df这个DataFrame里 max_order_df = df.groupby(['ContractorName', 'ProjectCode'])['OrderID'].max().reset_index() # 合并后提取需要的列 result_df = pd.merge(df, max_order_df, on=['ContractorName', 'ProjectCode', 'OrderID'], how='inner')[['ContractorName', 'ProjectCode', 'InvoiceID']]
方法2:排序后去重(更简洁)
先按分组字段排序,再按OrderID降序排列,最后保留每个分组的第一行:
# 排序:先按分组字段升序,再按OrderID降序 sorted_df = df.sort_values(by=['ContractorName', 'ProjectCode', 'OrderID'], ascending=[True, True, False]) # 保留每个分组的第一行(也就是OrderID最大的行) result_df = sorted_df.drop_duplicates(subset=['ContractorName', 'ProjectCode'], keep='first')[['ContractorName', 'ProjectCode', 'InvoiceID']]
同样,如果要保留所有并列最大的行,把drop_duplicates换成过滤条件就行:
# 先拿到每个分组的最大OrderID max_order = df.groupby(['ContractorName', 'ProjectCode'])['OrderID'].max() # 过滤出所有等于对应分组最大OrderID的行 result_df = df[df.apply(lambda row: row['OrderID'] == max_order[(row['ContractorName'], row['ProjectCode'])], axis=1)]
内容的提问来源于stack exchange,提问作者Payman
相关产品推荐
相关产品推荐

