【问题标题】:How can I delete row from a postgreSQL table where there are repeats on a specific column? [duplicate]如何从 postgreSQL 表中删除特定列上重复的行? [复制]
【发布时间】:2014-10-14 04:03:27
【问题描述】:

我有一个表,我需要删除所有具有相同 url 和 parent_url 的行。 该表包含以下列:

id, time, url, parent_url, source

重复如下:

1,12-24-2014,asdf.com, http://repeat.com, email
1,12-24-2014,zxzy.com, http://secondrepeat.com, email
2,12-26-2014,asdf.com, http://repeat.com, email
3,12-26-2014,zxzy.com, http://secondrepeat.com, email
4,12-27-2014,asdf.com, http://repeat.com, email

这些需要减少到以下 2 行(已删除 3 行):

1,12-24-2014,asdf.com, http://repeat.com, email
1,12-24-2014,zxzy.com, http://secondrepeat.com, email

我一直在尝试使用 for 循环,并且一直在寻找遵循这种格式的查询,但没有找到任何可以说明如何完成此计数的任何内容。

例如,我尝试做

DELETE FROM scraper WHERE (url, parent_url) IN (SELECT(url, parent_url) FROM scraper GROUP BY url, parent_url having count(*) > 1);

【问题讨论】:

标签: sql postgresql


【解决方案1】:

您可以使用not exists,例如:

delete from scraper
     where exists (select 1
                   from scraper s2
                   where s2.url = scraper.url and s2.prent_url = s.parent_url and
                         s2.time < s.time
                  );

或者,您可以将引用的解决方案调整为以下内容:

delete from scraper
     where id not in (select min(id)
                      from scraper s2
                      group by s2.url, s2.prent_url 
                     );

从问题中不清楚timeid是否为min()提供了更好的选择。

【讨论】:

  • DELETE FROM scraper WHERE id NOT IN (SELECT min(id) FROM scraper s2 GROUP BY s2.url, s2.parent_url);
  • 注意min(id) 不保证是唯一的。第二个查询不一定对。
猜你喜欢
  • 2021-06-13
  • 2023-01-18
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多