0

I am looking to retrieve all the the records and columns by order number of a table TEST where for a each order number the MAX of the column orderDeliveryDate is equal to yesterday. The following code does not work:

SELECT  T.* 
FROM    TEST T
    INNER JOIN(
            SELECT orderNum, MAX(orderDeliveryDate) AS maxDeliveryDate
            FROM TEST
            GROUP BY orderNum) MX
        ON T.orderNum= MX.orderNum
        AND T.orderDeliveryDate = MX.maxDeliveryDate
        AND MX.maxDeliveryDate = DATE_SUB(curdate(),INTERVAL 1 DAY)
Arnaud Martinn
  • 95
  • 2
  • 11

2 Answers2

0

This should do it:

SELECT * FROM TEST 
WHERE ORDERNUM IN 
    (SELECT ORDERNUM, MAX(orderDeliveryDate)
     FROM TEST GROUP BY ORDERNUM 
     HAVING DATE(MAX(orderDeliveryDate)) = DATE(DATE_SUB(curdate(),INTERVAL 1 DAY)))

The guess I'm making is orderDeliveryDate is a DateTime, so converting it to a Date will fix your problem. Your original query would work with the conversion to Date, I think mine is just a little more straightforward.

John Kuhns
  • 506
  • 4
  • 20
0

Convert the column to a date before comparing, and for an efficiency move the test into the sub query:

SELECT  T.* 
FROM TEST T
JOIN(
    SELECT orderNum, DATE(MAX(orderDeliveryDate)) AS maxDeliveryDate
    FROM TEST
    GROUP BY orderNum
    HAVING DATE(MAX(orderDeliveryDate)) = DATE_SUB(curdate(),INTERVAL 1 DAY)
    ) MX
    ON T.orderNum= MX.orderNum
    AND DATE(T.orderDeliveryDate) = MX.maxDeliveryDate
Bohemian
  • 412,405
  • 93
  • 575
  • 722