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

如何基于时间与流程级别两列创建Index列,统计Status Key 1-6循环次数

实现逻辑说明

你要的Index列核心逻辑是按Product ID分组后,基于时间顺序判断1-6的阶段循环触发点,每次触发计数+1:

  • 触发条件:当前行Status Key为1,且同分组内前一个时间点的行Status Key为6(如果是分组首行且Status Key为1也直接触发第一次计数)
  • 非触发行直接继承最近一次的计数值即可
  • 如果需要调整起始序号,最终计算结果加上对应偏移量即可

代码实现

1. SQL 实现(支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、Spark SQL等)

SELECT 
    *,
    -- 加上起始偏移量即可自定义起始序号,比如起始为2就 +1
    SUM(cycle_trigger) OVER (PARTITION BY `Product ID` ORDER BY 时间戳) AS `Index`
FROM (
    SELECT 
        *,
        CASE 
            WHEN `Status Key` = 1 AND (LAG(`Status Key`) OVER (PARTITION BY `Product ID` ORDER BY 时间戳) = 6 OR LAG(`Status Key`) OVER (PARTITION BY `Product ID` ORDER BY 时间戳) IS NULL)
            THEN 1
            ELSE 0
        END AS cycle_trigger
    FROM 你的表名
) t

如果业务中存在未走完6就直接回退到1的情况(比如从3直接跳回1也算新循环),可以把触发条件修改为:

WHEN `Status Key` = 1 AND (LAG(`Status Key`) OVER (PARTITION BY `Product ID` ORDER BY 时间戳) != 1 OR LAG(`Status Key`) OVER (PARTITION BY `Product ID` ORDER BY 时间戳) IS NULL)

2. Python Pandas 实现

import pandas as pd

# 先确保数据按Product ID和时间戳排序
df = df.sort_values(by=['Product ID', '时间戳']).reset_index(drop=True)

# 生成循环触发标记
df['cycle_trigger'] = df.groupby('Product ID')['Status Key'].apply(
    lambda x: ((x == 1) & (x.shift(1) == 6 | x.shift(1).isna())).astype(int)
).reset_index(drop=True)

# 计算Index,加偏移量可调整起始值
df['Index'] = df.groupby('Product ID')['cycle_trigger'].cumsum()

效果示例

表格示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:57:02