2015-08-16 2 views
0

У меня есть таблица под названием TEST с 5 столбцами: clientName, clientID, productNum, orderNum, orderDeliveryDate и тысячами строк. Он в основном хранит заказы. Каждый заказ может состоять из нескольких элементов продукта, и каждый товар может иметь конкретную дату поставки.Как создать запрос, который дает MAXDATE для каждого заказа?

мне нужно получить таблицу, которая показывает, для каждого orderNum последней orderDeliveryDate, а остальные TEST столбцов таблицы (NB: NULL значения должны быть исключены, так как она не должна рассматриваться как действительные даты).

Я знаю, что мне нужно использовать JOIN, но не могу найти решение.

SELECT * 
FROM `TEST` 
INNER JOIN 
    (SELECT 
     orderNum, MAX(orderDeliveryDate) AS maxdate 
    FROM TEST 
    GROUP BY orderNum) groupedorders ON TEST.orderNum = groupedorders.orderNum 
             AND TEST.orderDeliveryDate = groupedorders.maxdate 
GROUP BY orderNum 
ORDER BY groupedorders.maxdate ASC 

Может ли кто-нибудь помочь мне решить эту проблему?

Благодарим за помощь.

+0

Пожалуйста, прочтите [Как спросите ** хороший ** вопрос?] (http://stackoverflow.com/help/how-to-ask) и опирайтесь на него –

+0

Спасибо marc_s. Я изменил вопрос для большей ясности. –

+0

Какие РСУБД это? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

ответ

1

Вам не нужно ПРИСОЕДИНЯЙТЕСЬ, если вы не хотите подключить другой стол. Все, что вам нужно сделать, это принять значение MAX. NULL значения, как правило, исключаются из групп, но если нужно, просто добавьте WHERE orderDeliveryDate IS NOT NULL

SELECT orderNum, MAX(orderDeliveryDate) maxDeliveryDate 
FROM test 
GROUP BY orderNum 

Однако, если вам нужно больше данных, а не только orderNum и последняя delivery даты, пожалуйста, подробно.

EDIT: Это возвращает последнюю дату поставки до вчерашнего дня

SELECT T.* 
FROM TEST T 
     INNER JOIN(
       SELECT orderNum, MAX(orderDeliveryDate) AS maxDeliveryDate 
       FROM TEST 
       WHERE orderDeliveryDate <= (yesterday) 
       GROUP BY orderNum) MX 
      ON T.orderNum= MX.orderNum 
      AND T.orderDeliveryDate = MX.maxDeliveryDate 

EDIT2: Этот следующий запрос возвращает все записи, которые имеют последнюю дату доставки = вчера

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) 
+0

Привет, Horia. Спасибо за этот ответ. Да, мне нужно увидеть все остальные столбцы моей таблицы (который содержит больше строк, чем я описал здесь для упрощения). –

+0

ОК, посмотрите на второй запрос - я думаю, что вы были там, но вам не нужно было добавлять какие-либо группировки, кроме как в подзапрос – Horia

+0

Спасибо, Хория. А что, если оттуда мы хотим увидеть только результат, где maxDeliveryDate = вчера? Где мы должны добавить: '= DATE_SUB (curdate(), INTERVAL 1 DAY)' statement?. –