在 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 的重复记录的主要内容,如果未能解决你的问题,请参考以下文章