我有一个表格,显示订单编号、订单描述以及放置日期。
有时会重复序号。我想得到所有有描述的唯一订单号码,但只有在重复的情况下才显示最近的订单。
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中的第一个,如何让它选择最新的?
发布于 2014-10-24 17:46:46
您可以使用它自己简化LEFT JOIN
表,on orderID
和添加一个连接条件t1.dateAdded < t2.dateAdded
。
最后,选择结果,其中t2.dateAdded
为null,并且每个顺序都有最新的条目。(因为,您当前在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为null的行。但是正如你也可以看到的:结果已经比表大了。因此,在这个例子中,您创建了6个附加的连接结果--只是为了以后扔掉它们。(我想,对于多达100.000个条目的表来说,这是没有问题的。仍然在500.000行服务器上运行,查询在大约2秒内执行。)
发布于 2014-10-24 17:39:27
尝试使用MAX()函数
SELECT orderID,orderInfo,MAX(dateAdded) from (
SELECT orderID,orderInfo,dateAdded from orders ORDER BY dateAdded DESC) as t
group by orderID
发布于 2014-10-24 17:40:34
就像你说的,你想要最近的,所以你可以用:
select * from orders group by orderID order by dateAdded desc
https://stackoverflow.com/questions/26553265
复制相似问题