sql - 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 中执行此操作,所以如果您更喜欢主动记录解决方案,我不会因此而讨厌您 :)
提前致谢。
解决方案
你可以试试下面的逻辑:
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
,其中离开时间也大于被考虑删除的记录的时间。如果我们找到这样的匹配项,那么根据您的定义它是重复的。
推荐阅读
- java - NullPointerException 使用带有 JUnit 5 到 Selenium 的 @Before 注释
- c++ - 为什么在 std::vector::push_back(T object) 方法中构造对象时调用析构函数?
- python - 如何在 Python 中通过 csvReader 使用高阶函数
- python - Visual Studio 代码:终端进程以退出代码终止:{0}
- javascript - 在 UCI 中使用 JavaScript 从 HTML 中过滤 Dynamics CRM 帐户主页
- c# - Unity UI 文本在游戏视图中正确显示,但在构建中不显示
- javascript - 日期更改间隔
- matlab - 1不等于1?MATLAB中的矩阵条目比较
- .net - 从 .net 核心 API 返回纯文本/非 JSON 数据
- r - 具有两种字体大小的单行 ggplot2 标题