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_id
和 stop_id
的另一条记录的任何记录,其中离开时间也比考虑删除的记录的时间 长。如果我们找到这样的匹配项,那么根据您的定义,它是重复项。
试试下面的方法
DELETE FROM table a
WHERE a.ctid <> (SELECT max(b.ctid)
FROM table b
WHERE a.stop_id = b.stop_id)
我在 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_id
和 stop_id
的另一条记录的任何记录,其中离开时间也比考虑删除的记录的时间 长。如果我们找到这样的匹配项,那么根据您的定义,它是重复项。
试试下面的方法
DELETE FROM table a
WHERE a.ctid <> (SELECT max(b.ctid)
FROM table b
WHERE a.stop_id = b.stop_id)