【问题标题】:How to deduplicate in Presto如何在 Presto 中进行重复数据删除
【发布时间】:2019-01-08 20:10:44
【问题描述】:

我有一个 Presto 表假设它有 [id, name, update_time] 列和数据

(1, Amy, 2018-08-01),
(1, Amy, 2018-08-02),
(1, Amyyyyyyy, 2018-08-03),
(2, Bob, 2018-08-01)

现在,我想执行一条sql,结果是

(1, Amyyyyyyy, 2018-08-03),
(2, Bob, 2018-08-01)

目前,我在 Presto 中进行重复数据删除的最佳方法如下。

select 
    t1.id, 
    t1.name,
    t1.update_time 
from table_name t1
join (select id, max(update_time) as update_time from table_name group by id) t2
    on t1.id = t2.id and t1.update_time = t2.update_time

更多信息,点赞deduplication in sql

有没有更好的方法在 Presto 中进行重复数据删除?

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    在 PrestoDB 中,我倾向于使用 row_number()

    select id, name, date
    from (select t.*,
                 row_number() over (partition by name order by date desc) as seqnum
          from table_name t
         ) t
    where seqnum = 1;
    

    【讨论】:

    • 这就是我想要的!您的 sql 性能良好:输入数据较少,但 cpu 和内存较多。我注意到在note
    【解决方案2】:

    你似乎想要subquery

    select t.*
    from table t
    where update_time = (select MAX(t1.update_time) from table t1 where t1.id = t.id);
    

    【讨论】:

    • 它比我的 sql(方式 1)做得更好,我添加到我的笔记中,谢谢
    【解决方案3】:

    这是另一种方式

    WITH latestDate AS (SELECT id,max(date) as latestDate FROM table_name GROUP BY id)
        SELECT id,name,date FROM table_name t INNER JOIN latestDate l ON t.id = l.id AND t.date = l.latestDate

    【讨论】:

      【解决方案4】:

      只需使用in 运算符

       select t.*
          from tableA t
          where update_time in (select MAX(tableA.update_time) from tableA goup by id)
      

      【讨论】:

      • 我认为这行不通,它还会显示行(1, Amy, 2018-08-01) 因为日期2018-08-01 是id = 2 的最大值,你可以试试看,我的英语还不够好解释!
      • @TonnerMààn 不,你错了,因为我只考虑 id 而不是名字
      • 这是存在问题的列 update_time,我进行了测试以确保结果符合我的预期,对不起,我的英语不是很好,所以我没有知道如何解释我的想法
      • 我认为@TonnerMààn 是对的,我曾尝试过。 GordonLinoff 和 YogeshSharma 给出的答案目前表现最好。我在click 中注意到了它们
      【解决方案5】:

      很简单:

      Select id, name, MAX(update_time) as [Last Update] from table_name Group by id
      

      希望对你有帮助

      【讨论】:

      • 感谢您的回答。没有清楚地描述我的问题是我的错。我已经编辑了我的问题。请检查。感谢您的帮助。
      • @AlexGum 在我的代码中我只需要从Group by 子句中删除列Name(我已经进行了编辑),@Yogesh Sharma 建议的其他代码也应该可以工作跨度>
      • 感谢您的回答。我很感激。但是在 Presto sql 中,SELECT 子句中的列必须在 GROUP BY 子句中,不像 MySql。 Gordon Linoff 的回答是真正的“Presto”风格。还是非常感谢。
      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      相关资源
      最近更新 更多