SQL如何按日期、产品名称及Unit_cost变动分配唯一序列编号
实现方案
核心思路
利用SQL窗口函数判断单价变化再累加得到序列值,仅需2步即可完成:
- 第一步:按产品分组、过账日升序排序,标记当前行单价与上一行单价是否发生变化,变化标记为
1,无变化标记为0 - 第二步:按产品分组,对上述变化标记做累加求和,得到的结果就是要求的连续序列编号
通用SQL代码(兼容MySQL 8.0+/PostgreSQL/SQL Server等主流数据库)
WITH cost_change_flag AS ( SELECT *, -- 判断当前行单价和上一行是否不同,不同则标记为1 CASE WHEN Unit_cost != LAG(Unit_cost, 1) OVER (PARTITION BY 产品名称 ORDER BY 过账日 ASC) THEN 1 ELSE 0 END AS change_flag FROM 你的业务表名 ) SELECT *, -- 累加变化标记得到序列,首行默认从1开始计数 SUM(change_flag) OVER (PARTITION BY 产品名称 ORDER BY 过账日 ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + 1 AS seq_num FROM cost_change_flag;
使用说明
- 代码中
产品名称、过账日为示例字段名,使用时替换为你表中对应的实际字段名即可 - 所有计算按产品维度隔离,不同产品的序列互不干扰,严格遵循日期从旧到新的排序规则
提示:如果存在同一天同一产品有多条记录的情况,可以在
ORDER BY子句中额外增加主键等唯一字段保证排序稳定性,避免结果随机。
内容的提问来源于stack exchange,提问作者Chandra Prasad
相关产品推荐
相关产品推荐

