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

按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:39:19