微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL:如何合并不区分大小写的重复项

如何解决SQL:如何合并不区分大小写的重复项

SQL小提琴

这是您的更新:

 UPDATE stats
 SET totalgames = x.games, wins = x.wins
 FROM (SELECT LOWER(nick) AS nick, SUM(totalgames) AS games, SUM(wins) AS wins
     FROM stats
      GROUP BY LOWER(nick) ) AS x
 WHERE LOWER(stats.nick) = x.nick;

这是删除删除重复行的删除

 DELETE FROM stats USING stats s2
 WHERE lower(stats.nick) = lower(s2.nick) AND stats.nick < s2.nick;

(请注意,“ update … from”和“ delete … using”语法是Postgres特定的,并且从此答和此答案中被无耻地窃取了。)

您可能还需要运行此命令以将所有名称都转换为小写形式:

 UPDATE STATS SET nick = lower(nick);

Aaaand在“ nick”的小写版本上抛出唯一索引(或向该列添加约束以禁止使用非小写值):

CREATE UNIQUE INDEX ON stats (LOWER(nick));

解决方法

在将重复记录合并为一个记录时,删除重复记录的最佳方法是什么?

我遇到这样的情况,该表会记录玩家姓名及其记录,如下所示:

stats
-------------------------------
nick     totalgames     wins   ...
John     100            40
john     200            97
Whistle  50             47
wHiStLe  75             72
...

我需要合并尼克重复的行(忽略大小写时),并将记录合并为一个,如下所示:

    stats
    -------------------------------
    nick     totalgames     wins   ...
    john     300            137
    whistle  125            119
    ...

我在Postgres中这样做。最好的方法是什么?

我知道我可以通过执行以下操作获取存在重复项的名称:

select lower(nick) as nick,totalgames,count(*) 
from stats 
group by lower(nick),totalgames
having count(*) > 1;

我想到了这样的事情:

update stats
set totalgames = totalgames + s.totalgames
from (that query up there) s
where lower(nick) = s.nick

除非这不能正常工作。而且我仍然似乎无法删除包含重复名称的其他重复行。我能做些什么?有什么建议?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。