Oracle查询advancedorders表同TICKET_ID分组最早记录方案咨询
问题排查
你当前的查询逻辑是通过max(id)取每个TICKET_ID分组下ID最大的记录,实际获取的是每组最新生成的变更明细,和你需要的「每组最早记录」需求相反。
解决方案
方案1:修改现有聚合查询逻辑
如果你的表ID是自增主键,ID数值越小代表记录生成时间越早,只需要将子查询中的max(id)改为min(id)即可:
SELECT * FROM database.advancedorders INNER JOIN ( SELECT TICKET_ID, min(id) as minId from database.advancedorders group by TICKET_ID ) groupedTable ON advancedorders.id = groupedTable.minId AND advancedorders.TICKET_ID = groupedTable.TICKET_ID
方案2:Oracle窗口函数写法(更推荐)
使用ROW_NUMBER窗口函数实现,可读性和扩展性更强,后续如果需要取每组第N条记录也可以快速调整:
SELECT * FROM ( SELECT a.*, -- 按TICKET_ID分组,按id升序排序;如果表有工单创建时间字段,更推荐用CREATE_TIME ASC排序更准确 ROW_NUMBER() OVER(PARTITION BY TICKET_ID ORDER BY id ASC) AS rn FROM database.advancedorders a ) t WHERE rn = 1;
优化建议
- 如果表中存储了工单变更时间字段(如
operation_time、create_time等),优先使用时间字段排序,比用ID判断记录先后更稳妥,可避免ID生成逻辑异常导致的排序错误 - 如果同一个
TICKET_ID可能存在多条同时生成的最早记录,需要全部返回的话,将ROW_NUMBER替换为RANK()即可
内容的提问来源于stack exchange,提问作者Dominik N
相关产品推荐
相关产品推荐

