2016-10-24 3 views
0

У меня есть таблица, в которой хранятся дата доставки и номер заказа.Как выбрать только вторую максимальную дату из таблицы

Здесь я был в состоянии получить заказ с максимальной датой поставки.

SELECT DISTINCT D.ORDER_NO 
FROM DELIVERY D 
WHERE D.CUSTOMER_NO =112 AND D.DELIVERY_DATE = (SELECT MAX(D1.DELIVERY_DATE) FROM DELIVERY D1 
WHERE D1.CUSTOMER_NO = 112); 

Здесь может быть несколько заказов.

Теперь я хочу получить только вторую максимальную дату.

Используя приведенный выше запрос, я смог получить список данных, отличных от максимальной даты поставки, изменив = на < и добавив ORDER BY в подзапрос.

Но его полный список, но я хочу только вторую максимальную дату.

Кто-то скажет мне, как я могу получить только вторую максимальную дату.

Примечание: Я попытался с помощью ROWNUM<=1, но я получаю неправильную дату

+0

Используете ли вы Oracle или SQL Server? –

+0

Удаление тега SQL Server, так как 'ROWNUM' является функцией Oracle –

+0

@TimBiegeleisen Я использую Oracle –

ответ

0
SELECT D.ORDER_NO 
FROM 
(
SELECT DISTINCT D.ORDER_NO,D.DELIVERY_DATE,ROW_NUMBER()OVER(order by D.DELIVERY_DATE desc) RowNo 
FROM DELIVERY D 
WHERE D.CUSTOMER_NO =1128158 
ORDER BY D.DELIVERY_DATE DESC) 
t WHERE t.RowNo = 2; 
-2

изменение D.DELIVERY_DATE =

в D.DELIVERY_DATE <

SELECT DISTINCT D.ORDER_NO 
    FROM DELIVERY D 
    WHERE D.CUSTOMER_NO =112 AND D.DELIVERY_DATE = (SELECT MAX(D1.DELIVERY_DATE) FROM DELIVERY D1 
    WHERE D1.CUSTOMER_NO = 112); 

ИЛИ ЧТО-ТО КАК НИЖЕ

SELECT MAX(DELIVERY_DATE) 
    FROM TABLE 
WHERE DELIVERY_DATE< (SELECT MAX(DELIVERY_DATE) 
       FROM TABLE) 
+0

Пожалуйста, обратите внимание на мой вопрос, что вы уже сказали. –

1
SELECT * FROM(
SELECT DISTINCT D.ORDER_NO, ROW_NUMBER()OVER(order by D.DELIVERY_DATE desc) RowNo 
FROM DELIVERY D 
WHERE D.CUSTOMER_NO =112 
) t where t.RowNo = 2 
1

Предполагая, что вы используете Oracle:

SELECT * 
FROM 
(
    SELECT t.*, rownum rnum 
    FROM 
    (
     SELECT DISTINCT D.ORDER_NO 
     FROM DELIVERY D 
     WHERE D.CUSTOMER_NO = 112 
     ORDER BY D.DELIVERY_DATE DESC 
    ) t 
    WHERE rownum <= 2 
) 
WHERE rnum >= 2 
+0

Когда я запускаю дополнительный запрос, я получаю 4 строки, но когда я запускаю весь запрос, я получаю 0 результат. Если я меняю «ROWNUM = 1», я получаю 1 строку. –

+0

@TonyRoczz Повторите попытку, спасибо. –

+0

Привет Это работает отлично, но я просто изменил ваш запрос, используя функцию 'ROW_NUMBER()' из ответа '@Munna Extreme', и он тоже работает –

0
SELECT TOP 1 D.ORDER_NO 
FROM DELIVERY D WHERE D.CUSTOMER_NO =112 
AND D.DELIVERY_DATE = (SELECT MAX(D1.DELIVERY_DATE) FROM DELIVERY D1 WHERE D1.CUSTOMER_NO = 112); 
ORDER BY DELIVERY_DATE DESC 
1

Вы можете попробовать этот запрос:

SELECT DISTINCT ORDER_NO FROM DELIVERY WHERE CUSTOMER_NO=112 AND DELIVERY_DATE = 
(SELECT MAX(DELIVERY_DATE) FROM DELIVERY WHERE CUSTOMER_NO=112 AND 
DELIVERY_DATE<(SELECT MAX(DELIVERY_DATE) FROM DELIVERY AND CUSTOMER_NO=112)); 

Суб запрос вернет второй срок поставки максимум, который даст order_no второго дня макс.