【问题标题】:SQL Eliminate Duplicate Row Based On Two ColumnsSQL基于两列消除重复行
【发布时间】:2021-06-04 06:54:43
【问题描述】:

尝试编写 Presto 查询以消除我正在考虑的重复条目。这是我的表格的简化版本:

colA colB colC
AA BB CC
BB AA CC
DD EE FF
AA DD GG

如果 colA 和 colB 包含反向重复的行,我想从我的查询结果中排除一个(即我们有 (AA, BB) 和 (BB, AA),所以我会得到:

colA colB colC
AA BB CC
DD EE FF
AA DD GG

我是否保留 (AA, BB) 或 (BB, AA) 配对并不重要,为此,它们是相同的。实际值是半随机字符串。

我尝试了多种方法,例如尝试 NOT EXISTS 和不同的 JOIN,但它们最终都删除了 (AA, BB) 和 (BB, AA) 行。

【问题讨论】:

    标签: sql presto trino


    【解决方案1】:

    一种方法是使用窗口函数:

    select a, b, c
    from (select t.*,
                 row_number() over (partition by least(a, b), greatest(a, b), c order by c) as seqnum
          from t
         ) t
    where seqnum = 1;
    

    另一种方法是使用not exists:

    select t.*
    from t
    where a < b or
          not exists (select 1
                      from t t2
                      where t2.c = t.c and
                            t2.b = t.a and
                            t2.a = t.b
                     );
    

    说实话,我不知道哪个会在 Presto 上表现更好。

    【讨论】:

    • NOT EXISTS 方法在我刚尝试时不起作用。我仍然得到重复的行。简化的示例只有 3 列,但实际上可能有数百列,但我只关心 colAcolB 就重复值而言。
    • @mhaken 。 . .您确定要在每个表中将 b 与 a 进行比较吗?
    • 嗯,我一定是打错了,重新输入,我认为现在可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2016-10-04
    • 2022-01-24
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多