SQL-从较早的日期删除所有重复项

时间:2018-08-01 14:57:08

标签: mysql 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

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这是您想要的吗?

select o.*
from orders o
where (o.order, o.date) in (select o2.order, min(o2.date) from orders o2);

答案 2 :(得分:0)

我认为最简单的方法是:

Select [order number], Min([Date]) as [Oldest Date], [Item]
From [your table]
Group by [order number], [Item]

答案 3 :(得分:0)

您可以使用 correlated subquery

select t.*
from table t
where date = (select max(t1.date) from table t1 where t1.orderno = t.orderno);

也许您还需要where子句中的项目。