如何按连续记录分组,基于对应列的MAX和MIN获取记录?
实现思路
核心是利用ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)对相同物品类型和字段标题的记录分组,再按连续的HISTORY_ID排序,生成组内序号,以此定位分组内的记录顺序,满足类似版本追踪的需求。
示例SQL代码
假设你的表名为item_history,字段定义如下:
item_type: 物品类型HISTORY_ID: 连续的历史记录IDfield_caption: 需要筛选的字段标题old_value: 字段旧值new_value: 字段新值change_date: 变更日期
按物品类型+字段标题分组,给每组内的记录按HISTORY_ID升序生成组内序号的SQL如下:
SELECT item_type, HISTORY_ID, field_caption, old_value, new_value, change_date, ROW_NUMBER() OVER( PARTITION BY item_type, field_caption ORDER BY HISTORY_ID ASC ) AS group_row_num FROM item_history -- 可按需添加筛选条件,比如指定目标字段标题 WHERE field_caption = '商品库存';
扩展场景说明
- 若要对比相邻版本的变更内容,可通过生成的
group_row_num做自关联,关联条件为a.item_type = b.item_type AND a.field_caption = b.field_caption AND a.group_row_num = b.group_row_num + 1,快速匹配上一条记录的新旧值。 - 如需筛选每个分组的最新N条记录,可在外层嵌套查询,添加过滤条件
group_row_num <= N。
内容的提问来源于stack exchange,提问作者Nino
相关产品推荐
相关产品推荐

