首页 > 解决方案 > SQL删除基于多个字段的重复行

问题描述

我在sql中有下表:

id | trip_id | stop_id | departure_time
----------------------------------------
1  |        1|        1|        06:25:00
2  |        1|        2|        06:35:00
3  |        1|        3|        06:45:00
4  |        1|        2|        06:55:00

我需要做的是将trip_id 确定为某个stop_id 的多个实例(在本例中为stop_id 2)。

然后,我需要删除所有重复项,只留下最晚出发时间的重复项。

因此,给定上表 ID 删除 id 为 2 的行并留下:

id | trip_id | stop_id | departure_time
----------------------------------------
1  |        1|        1|        06:25:00
3  |        1|        3|        06:45:00
4  |        1|        2|        06:55:00

我已经设法通过一系列 sql 查询来做到这一点,但我遇到了 N+1 问题,这需要很长时间。

谁能推荐一种我可以在一个查询中执行此操作的方法?或者至少确定需要在一个查询中删除的所有行的 ID?

我在 ruby​​ on rails 中执行此操作,所以如果您更喜欢主动记录解决方案,我不会因此而讨厌您 :)

提前致谢。

标签: sqlpostgresqlduplicatessql-delete

解决方案


你可以试试下面的逻辑:

DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.trip_id = t1.trip_id AND
                    t2.stop_id = t1.stop_id AND
                    t2.departure_time > t1.departure_time);

用简单的英语来说,这表示扫描整个表,并删除我们可以找到另一条具有相同trip_id和的记录的任何记录stop_id,其中离开时间也大于被考虑删除的记录的时间。如果我们找到这样的匹配项,那么根据您的定义它是重复的。


推荐阅读