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

如何使用SQL/HiveQL删除带旧refresh_id的重复记录

SQL/HiveQL 按组保留最大refresh_id去重方案

问题根因

你原有查询仅计算了分组排名,未添加排名过滤逻辑,因此无法剔除旧refresh_id的重复行,额外加的refresh_id in条件也是不必要的。

实现逻辑

以day+product_id作为重复判断的分组维度,为每组内的记录按refresh_id倒序排名,仅保留排名为1的所有记录即可,符合你要求的保留同组最新refresh_id全部行、删除旧refresh_id行的需求。

代码实现

1. 临时查询获取结果

SELECT day, product_id, refresh_id
FROM (
    SELECT 
        day,
        product_id,
        refresh_id,
        DENSE_RANK() OVER(PARTITION BY day, product_id ORDER BY refresh_id DESC) AS rk
    FROM mod_op
) t
WHERE rk = 1;

2. Hive 物理删除原表旧数据(覆盖写法)

Hive不支持直接删除表内指定行,可通过INSERT OVERWRITE覆盖原表实现去重:

INSERT OVERWRITE TABLE mod_op
SELECT day, product_id, refresh_id
FROM (
    SELECT 
        day,
        product_id,
        refresh_id,
        DENSE_RANK() OVER(PARTITION BY day, product_id ORDER BY refresh_id DESC) AS rk
    FROM mod_op
) t
WHERE rk = 1;

3. 传统关系型数据库(如MySQL)删除旧数据写法

DELETE m1
FROM mod_op m1
JOIN mod_op m2 
  ON m1.day = m2.day 
  AND m1.product_id = m2.product_id
  AND m1.refresh_id < m2.refresh_id;

内容的提问来源于stack exchange,提问作者Diganta Dey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:45:10