我有一张表格,显示订单号,订单说明以及它们的放置日期。
有时会重复订单号。我希望获得所有带有描述的唯一订单号,但只显示重复的最新订单
orderID orderInfo dateAdded
1 cheese 2014-10-01
1 cheese+ 2014-10-02
1 cheese&tomato 2014-10-03
2 bacon 2014-10-05
2 bacon 2014-10-04
2 bacon 2014-10-02
3 tuna 2014-09-30
所以我的查询应该返回:
orderID orderInfo dateAdded
1 cheese&tomato 2014-10-03
2 bacon 2014-10-05
3 tuna 2014-09-30
我试过了:
select orderID, orderInfo from orders group by orderID
但这只是给了我每个orderID的第一个,如何让它选择最新的?
答案 0 :(得分:2)
您可以简单地LEFT JOIN
自己的表格on orderID
和添加加入条件t1.dateAdded < t2.dateAdded
。
最后,您选择结果,t2.dateAdded
为空,并且每个订单都有最新条目。
(因为那时,您当前在t1
中的结果是加入组内的最新日期)
SELECT
*
FROM
test t1
LEFT JOIN
test t2
ON
t1.id = t2.id AND
t1.dateAdded < t2.dateAdded
WHERE
ISNULL (t2.dateAdded);
http://sqlfiddle.com/#!2/0629b2/1
但请注意,对于巨大的表,这可能是巨大的加入!
在幕后看: http://sqlfiddle.com/#!2/0629b2/3
如您所见,您需要 t2_dateAdded 为空的行。但是您也可以看到:与表格相比,结果已经更大了。所以在这个例子中你创建了6个额外的连接结果 - 只是为了之后扔掉它们。 (对于我认为超过100.000个条目的表,没有问题。仍然在具有500.000行的服务器上运行它,并且查询在~2秒内执行。)
答案 1 :(得分:0)
尝试使用MAX()函数
SELECT orderID,orderInfo,MAX(dateAdded) from (
SELECT orderID,orderInfo,dateAdded from orders ORDER BY dateAdded DESC) as t
group by orderID
答案 2 :(得分:-1)
正如你所说,你想要最新的,所以你可以使用:
select * from orders group by orderID order by dateAdded desc