请求协助:从含重复行的表中获取带最新update_dt的唯一行列表
嘿,这个场景我太熟悉了!之前做电商库存系统的时候也碰到过类似的问题——每次新增条目导致同product_id和r_store_id的重复行,要捞最新的唯一行对吧?别慌,分两步就能搞定!
第一步:用SQL筛选出每组的最新唯一行
核心需求是对每一组相同的product_id+r_store_id,只保留update_dt最大的那一行。不同数据库的写法略有差异,我给你列几种常用的方案:
方法1:窗口函数(推荐,适配绝大多数现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server、Oracle等),这是最清晰直观的写法:
SELECT * FROM ( SELECT *, -- 按product_id和r_store_id分组,组内按更新时间倒序排,给每行标序号 ROW_NUMBER() OVER (PARTITION BY product_id, r_store_id ORDER BY update_dt DESC) AS row_num FROM your_table_name ) filtered_table -- 只取每组的第一行(也就是最新的那一行) WHERE row_num = 1;
简单说就是:先把数据按product_id和r_store_id分成一个个小组,每个小组里把最新的行排第一,最后只留下每个小组的第一名。
方法2:适配老版本MySQL(5.x及以下)
要是你的MySQL版本不支持窗口函数,可以用关联查询的方式实现:
SELECT t1.* FROM your_table_name t1 -- 先找出每组的最新更新时间 JOIN ( SELECT product_id, r_store_id, MAX(update_dt) AS latest_update_time FROM your_table_name GROUP BY product_id, r_store_id ) t2 ON t1.product_id = t2.product_id AND t1.r_store_id = t2.r_store_id AND t1.update_dt = t2.latest_update_time;
逻辑是:先查出来每个product_id+r_store_id组合的最新时间,再用这个时间去原表里匹配对应的完整行。
第二步:把查询结果存入列表
假设你用Python处理结果(毕竟是脚本场景里最常用的语言),以pymysql为例,代码大概是这样:
import pymysql # 连接数据库(替换成你的实际配置) db_conn = pymysql.connect( host="your_db_host", user="your_db_user", password="your_db_pwd", database="your_db_name" ) try: # 用字典游标,返回的每条数据是字典格式,方便后续处理 with db_conn.cursor(pymysql.cursors.DictCursor) as cursor: # 把上面的SQL填进来 query_sql = """ SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id, r_store_id ORDER BY update_dt DESC) AS row_num FROM your_table_name ) filtered_table WHERE row_num = 1; """ cursor.execute(query_sql) # 直接把所有结果捞进列表里 unique_latest_list = cursor.fetchall() # 这里就可以用这个列表做后续操作了 print(unique_latest_list) finally: # 记得关闭连接 db_conn.close()
如果用其他语言(比如Java、PHP),逻辑也是一样的:执行筛选后的SQL,把查询结果逐条读取到列表/集合里就行。
额外小优化
如果你的表数据量很大,建议给product_id、r_store_id、update_dt建个联合索引,能大幅提升查询速度:
CREATE INDEX idx_product_store_update ON your_table_name(product_id, r_store_id, update_dt DESC);
内容的提问来源于stack exchange,提问作者iamP
相关产品推荐
相关产品推荐

