在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
相关产品推荐
相关产品推荐

