在 SQL/HiveQL 中删除具有旧 id 的重复记录

Posted

技术标签:

【中文标题】在 SQL/HiveQL 中删除具有旧 id 的重复记录【英文标题】:Removing duplicate records with old id in SQL/ HiveQL 【发布时间】:2022-01-03 08:29:47 【问题描述】:

我有一张如下表。在这个表中,我们有多个相同的记录,只是具有不同的 refresh_id。但是我们必须选择具有最新 refresh_id 的记录,例如我们必须删除粗体/突出显示的行,因为它们的重复项可通过最新的 refresh_id 获得。请帮助我使用 SQL/HiveQL 解决这个问题。

[1]: https://i.stack.imgur.com/YTFav.png

day product_id refresh_id
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637430516
11/19/2021 efgh 1637430516
12/11/2021 ijkl 1637430516
12/11/2021 ijkl 1637430250

输出:

day product_id refresh_id
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 abcd 1637515839
11/19/2021 efgh 1637430516
12/11/2021 ijkl 1637430516

我尝试了以下查询作为尝试,但似乎根本没有帮助,请给我一些线索。

select mod_op.day, mod_op.product_id, mod_op.refresh_id
    , dense_rank() over(partition by mod_op.day,mod_op.product_id order by mod_op.refresh_id desc) as dense_rank
from table mod_op
where mod_op.refresh_id in (refresh_id1, refresh_id2);

【问题讨论】:

mysql SQL Server Hive - 请更正您的标签。 【参考方案1】:

您的查询是正确的。您需要一个外部子查询来选择所需的行。

select day,product_id,refresh_id --outer sub qry to select desired columns.
from 
(select mod_op.day, mod_op.product_id, mod_op.refresh_id
    , dense_rank() over(partition by mod_op.day,mod_op.product_id order by mod_op.refresh_id desc) as dense_rank
from table mod_op
where mod_op.refresh_id in (refresh_id1, refresh_id2)) rs
where rs.dense_rank=1 --added this to pick highest refresh id
;

【讨论】:

但是这里我需要找到历史数据,所以我必须找到dense_rank=2的数据,但是它不应该包含dense_rank=1的任何日期 你不要求选择最新的吗? 不,我需要历史数据。这是因为数据摄取问题导致同一日期的 refresh_id 不同。

以上是关于在 SQL/HiveQL 中删除具有旧 id 的重复记录的主要内容,如果未能解决你的问题,请参考以下文章

核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?

如何在pyspark中使用具有相同客户ID的新数据框的值更新一行旧数据框

Ant/ivy 脚本有助于删除具有阈值的旧工件

在远程 squash 后提取旧的提交 ID

删除商店中的旧应用后上传新应用时出错

强制浏览器忘记缓存的重定向?