【问题标题】:SQL remove rows by duplicates in the specified column [duplicate]SQL通过指定列中的重复项删除行[重复]
【发布时间】:2021-05-17 02:38:26
【问题描述】:

我有如下这样的数据,

id,username,whatevermorecolumns
1,cat,more data here..
2,kitty,..
3,cat,..
4,kitten,..

并且想要删除具有重复用户名的行。所以我期待这样的结果

id,username,whatevermorecolumns
1,cat,more data here..
2,kitty,..
4,kitten,..

有一个问题,id 1 或 3,应该被删除,也许,我也很想知道,但我想要做的是在过滤选择结果后 count() 行,所以不是这是一个大问题。

我在 Google 上搜索并阅读了一些 stackoverflow 帖子,尝试了“group by”和“distinct”的东西,但对此仍然没有好主意。也许是因为它是postgresql?感谢您的帮助。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    你试过DISTINCT ON吗?

    在 Stack Overflow 上与您的情况类似:sql - Remove duplicate rows based on field in a select query with PostgreSQL? - Stack Overflow

    例子:

    SELECT DISTINCT ON (username) id, username, whatevermorecolumns 
    from table
    where ..
    

    【讨论】:

      【解决方案2】:

      区别于应该做的工作

      id username whatevermorecolumns
      1 cat more data here..
      2 kitty,..
      3 cat,..
      4 kitten,..
      SELECT DISTINCT ON (username)
        id,
        username,
        whatevermorecolumns,
      FROM tablename;
      

      DISTINCT ON 将确保您获得一行用于括号中指定的唯一键组合(代码的第 1 行)。

      【讨论】:

        【解决方案3】:

        如果你想删除行,那么你可以使用delete修改表格:

        delete from t
            where t.id > (select min(t2.id) from t t2 where t2.username = t.username);
        

        这将删除除id 最小的行之外的所有内容。

        如果您只想要一个没有重复的结果集,那么推荐distinct on 的其他答案是正确的答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-13
          • 2017-05-28
          相关资源
          最近更新 更多