You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据表格子列的顺序字符串值设置条件行号

按分组生成循环递增的条件行号

原数据

colsub_col
AA
AB
AC
AA
AB
AC
BA
BB
BB
BC
BA
BB
BB
BC

目标结果

colsub_colorder_by_sub_col
AA0
AB1
AC2
AA0
AB1
AC2
BA0
BB1
BB2
BC3
BA0
BB1
BB2
BC3

解决方案

核心思路是按col分组,先识别每个循环的起始点(即sub_col='A'的行),给每个循环分配唯一组ID,再在循环组内生成从0开始的递增编号。

支持窗口函数的数据库(PostgreSQL、MySQL 8.0+、SQL Server等)

SELECT 
    col,
    sub_col,
    ROW_NUMBER() OVER (PARTITION BY col, cycle_id ORDER BY (SELECT NULL)) - 1 AS order_by_sub_col
FROM (
    SELECT 
        col,
        sub_col,
        -- 按col分组,累加标记循环起始点,生成循环ID
        SUM(CASE WHEN sub_col = 'A' THEN 1 ELSE 0 END) OVER (PARTITION BY col ORDER BY (SELECT NULL)) AS cycle_id
    FROM your_table
) t
-- 保持原数据顺序
ORDER BY col, cycle_id, order_by_sub_col;

说明

  • 内层查询通过SUM() OVER()窗口函数,按col分组、行顺序累加,遇到sub_col='A'时加1,同一循环内的行共享相同的cycle_id。
  • 外层查询用ROW_NUMBER()在col+cycle_id分组内生成行号,减1后得到从0开始的编号。
  • ORDER BY (SELECT NULL)用于保留原表行顺序,若有明确的排序字段可替换为实际字段。

MySQL 5.x(无窗口函数)实现

SET @prev_col = '';
SET @row_num = -1;

SELECT 
    col,
    sub_col,
    @row_num := CASE
        WHEN col != @prev_col OR sub_col = 'A' THEN 0
        ELSE @row_num + 1
    END AS order_by_sub_col,
    @prev_col := col
FROM your_table
ORDER BY col, (SELECT NULL)
HAVING order_by_sub_col IS NOT NULL;

内容的提问来源于stack exchange,提问作者AlexeyPrikhodko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:40:25