如何将指定范围的修改记录按固定数量分组并确定ID序列
实现修改记录的分组统计
需求说明
现有一张包含300条记录的数据表,需筛选出今日已修改的行。已知这类修改记录的ID范围(例如min=1、max=100),但实际仅存在37条ID不连续的修改记录,需要将这些记录按每组最多10条划分,输出格式如下:
| row_group_range | id_values | row_group |
|---|---|---|
| 10 | 1,3,5,6,7,10,14,16,20,22 | 1 |
| 10 | 26,30,33,36,41,44,48,52,60,61 | 2 |
| 10 | 65,68,70,72,75,77,79,80,84,85 | 3 |
| 8 | 90,91,92,93,94,95,96,98 | 4 |
SQL实现方案
假设数据表名为your_table,修改时间字段为modified_at,可通过以下SQL语句直接生成分组结果:
WITH modified_records AS ( -- 筛选今日修改的记录并按ID排序,分配行号 SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM your_table WHERE DATE(modified_at) = CURRENT_DATE -- MySQL可替换为CURDATE(),Oracle用TRUNC(SYSDATE) ) SELECT COUNT(id) AS row_group_range, STRING_AGG(CAST(id AS VARCHAR), ',') AS id_values, -- PostgreSQL用法,MySQL用GROUP_CONCAT(id),Oracle用LISTAGG(id, ',') FLOOR((row_num - 1)/10) + 1 AS row_group FROM modified_records GROUP BY FLOOR((row_num - 1)/10) + 1 ORDER BY row_group;
关键逻辑说明:
modified_recordsCTE:筛选今日修改的记录,并用ROW_NUMBER()按ID排序给每条记录分配行号- 分组计算:通过
FLOOR((row_num - 1)/10) + 1将行号1-10归为组1,11-20归为组2,以此类推 - 聚合操作:用
COUNT(id)统计每组记录数,对应数据库的字符串聚合函数将每组ID拼接为逗号分隔的字符串
Python实现方案
如果需要在应用层处理,可先从数据库查询出所有今日修改的ID并排序,再通过切片分组:
# 假设已从数据库获取到排序后的修改ID列表 modified_ids = [1,3,5,6,7,10,14,16,20,22,26,30,33,36,41,44,48,52,60,61,65,68,70,72,75,77,79,80,84,85,90,91,92,93,94,95,96,98] group_size = 10 result = [] for idx in range(0, len(modified_ids), group_size): current_group = modified_ids[idx:idx+group_size] result.append({ "row_group_range": len(current_group), "id_values": ",".join(map(str, current_group)), "row_group": (idx // group_size) + 1 }) # 打印格式化结果 print("row_group_range | id_values | row_group") print("------------------------------------------------------------------------------------") for item in result: print(f"{item['row_group_range']:<19} | {item['id_values']:<38} | {item['row_group']}")
内容的提问来源于stack exchange,提问作者Cesar Tepetla
相关产品推荐
相关产品推荐

