SQL 根据多个字段删除重复行

SQL delete duplicate rows based on multiple fields

我在 sql 中有以下 table:

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)。

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

鉴于上述 table 我删除了 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?

我在 rails 的 ruby 中这样做,所以如果您更喜欢活动记录解决方案,我不会因此讨厌您 :)

提前致谢。

你可以试试下面的方法-

   DELETE FROM tablename
   WHERE id in
    (
    select id from
      (select *, row_number() over(partition by stop_id order by departure_time desc) as rn from tablename)aa
    )A where rn>1

你可以试试下面的逻辑:

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);

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

试试下面的方法

DELETE FROM table a
WHERE a.ctid <> (SELECT max(b.ctid)
                 FROM   table b
                 WHERE  a.stop_id = b.stop_id)