基于value列实现行编号,遇值'd'重置计数的SQL方法求助
解决方案
核心思路是先标记出所有value = 'd'的行,再通过累计求和生成分组标识,最终基于分组标识得到所需的编号。
步骤说明
- 标记触发行:给
value为d的行标记为1,其他行标记为0; - 生成分组标识:计算当前行之前所有触发行的累计数量,以此作为分组基础;
- 计算最终编号:将分组标识加1,得到每组的编号(第一组无前置触发行,需加1补位)。
SQL 代码示例
假设你的表名为your_table,若没有天然的行顺序字段,可先生成行号保证排序逻辑:
WITH flagged_rows AS ( SELECT id, value, -- 标记需要重置计数的行 CASE WHEN value = 'd' THEN 1 ELSE 0 END AS reset_flag, -- 生成行号确保数据顺序与示例一致 ROW_NUMBER() OVER () AS row_num FROM your_table ), grouped_data AS ( SELECT id, value, -- 计算当前行之前所有触发行的累计和 SUM(reset_flag) OVER (ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS group_id FROM flagged_rows ) SELECT id, value, -- 处理第一行分组ID为NULL的情况,加1得到最终编号 COALESCE(group_id, 0) + 1 AS outcome FROM grouped_data;
代码解释
flagged_rowsCTE:给触发计数重置的行打标记,同时生成行号保证数据排序与示例一致;grouped_dataCTE:用窗口函数SUM() OVER()计算当前行之前所有触发行的总数,生成分组ID;- 最终查询:用
COALESCE处理第一行分组ID为NULL的情况,加1后得到符合预期的outcome编号。
该方法兼容性较强,适用于PostgreSQL、MySQL 8.0+、SQL Server等主流数据库。
内容的提问来源于stack exchange,提问作者user3642271
相关产品推荐
相关产品推荐

