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

请求协助:从含重复行的表中获取带最新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:18:07