首页 > 解决方案 > SQL - 删除较早日期的所有重复项

问题描述

我的数据库中有这个示例数据:

Order number | Date       | Item
23           | 2017-05-23 | Apple
23           | 2017-05-23 | Banana
24           | 2017-05-24 | Apple
23           | 2018-03-21 | Apple
23           | 2018-03-21 | Banana

这可能看起来像一个奇怪的 SQL - 查询,但我想从每一天获取所有订单号及其包含日期和项目,但如果订单号已在多个日期注册,我只想要“最旧”的实例.

在这种情况下,答案应该是:

Order number | Date       | Item
23           | 2017-05-23 | Apple
23           | 2017-05-23 | Banana
24           | 2017-05-24 | Apple

感谢您的帮助。

标签: mysqlsql

解决方案


除了 Gordon 给出的之外,编写此查询的更标准方法是加入一个子查询,该子查询为每个订单/项目组找到最新记录:

SELECT o1.*
FROM orders o1
INNER JOIN
(
    SELECT o_num, item, MIN(Date) AS min_date
    FROM orders
    GROUP BY o_num, item
) o2
    ON o1.o_num = o2.o_num AND o1.item = o2.item AND o1.Date = o2.min_date;

在支持基本分析功能的 MySQL 8+ 中,我们可以更简洁地将这个查询写成:

SELECT o_num, Date, item
FROM
(
    SELECT o_num, Date, item,
        ROW_NUMBER() OVER (PARTITION BY o_num, item ORDER BY Date) rn
    FROM orders
) t
WHERE rn = 1;

推荐阅读