如何在满足指定条件时让数据表列按rowid顺序基于前一行值逐行加1
逐行累计更新W列实现方案
你的原有UPDATE语句属于集合级操作,所有符合条件的行会基于更新前的原值同时+1,无法实现按rowid顺序递推累计,以下是两种可行实现方案:
方案1:Python逐行遍历实现(全版本兼容)
该方案兼容性最好,无需考虑SQLite版本,严格按照rowid升序计算累计值:
import sqlite3 # 连接数据库 conn = sqlite3.connect('替换为你的数据库文件路径.db') c = conn.cursor() reswin = "替换为你的目标reswin值" # 初始化W累计计数器 current_w = 0 # 按rowid升序查询所有行的rowid和Res值 c.execute("SELECT rowid, Res FROM profiletable ORDER BY rowid ASC") for row in c.fetchall(): rowid, current_res = row # 匹配到reswin时累计值+1 if current_res == reswin: current_w += 1 # 更新当前行的W字段 c.execute("UPDATE profiletable SET W = ? WHERE rowid = ?", (current_w, rowid)) # 提交所有修改 conn.commit() conn.close()
方案2:窗口函数单SQL实现(高版本SQLite适用,性能更优)
如果你的SQLite版本≥3.25.0,可以直接执行以下SQL语句,无需逐行遍历,处理大数据量时效率更高:
reswin = "替换为你的目标reswin值" c.execute(""" WITH ranked_data AS ( SELECT rowid, SUM(CASE WHEN Res = ? THEN 1 ELSE 0 END) OVER (ORDER BY rowid ASC) AS new_w FROM profiletable ) UPDATE profiletable SET W = (SELECT new_w FROM ranked_data WHERE ranked_data.rowid = profiletable.rowid) """, (reswin,)) conn.commit()
内容的提问来源于stack exchange,提问作者yfr code
相关产品推荐
相关产品推荐

