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

在PySpark中创建基于多字段组合的条件自增重置ID字段

解法

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

直接使用ROW_NUMBER()窗口函数即可实现需求,核心逻辑是按你指定的三个字段分组,组内按日期升序排序后生成序号:

SELECT 
    date,
    userID,
    accountID,
    `lock/unlock`,
    ROW_NUMBER() OVER (
        -- 按三个字段分组,相同组合的行归为同一组
        PARTITION BY userID, accountID, `lock/unlock` 
        -- 组内按日期升序排列,保证序号按时间先后递增
        ORDER BY STR_TO_DATE(date, '%d/%m/%Y') ASC
    ) AS newID
FROM 你的实际表名;

注:如果是PostgreSQL可以用TO_DATE(date, 'DD/MM/YYYY')做日期转换,SQL Server用CONVERT(DATE, date, 103),目的是把字符串格式的日期转成可正确排序的日期类型,避免字符串排序出现逻辑错误。

Python Pandas 场景

如果是用Python处理本地数据表,用groupby+cumcount即可实现:

import pandas as pd

# 1. 加载数据(替换为你自己的数据源加载逻辑)
# df = pd.read_excel("你的数据文件路径.xlsx")
# df = pd.read_csv("你的数据文件路径.csv")

# 2. 转换日期列为标准日期类型,保证排序正确
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')

# 3. 按三个字段分组,组内按日期排序后生成序号(cumcount从0开始,所以要+1)
df['newID'] = df.groupby(['userID', 'accountID', 'lock/unlock'])['date'].cumcount() + 1

# 可选:按userID、accountID、日期排序输出,展示更直观
df = df.sort_values(by=['userID', 'accountID', 'date']).reset_index(drop=True)

两种方法输出的结果和你给出的预期效果完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:11