Как выбрать только вторую максимальную дату из таблицы

#sql #oracle #date #greatest-n-per-group

#sql #Oracle #Дата #наибольшее число на группу

Вопрос:

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

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

 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 , но я получаю неправильную дату

Комментарии:

1. Вы используете Oracle или SQL Server?

2. Удаление тега SQL Server, поскольку ROWNUM это функция Oracle

3. @TimBiegeleisen я использую Oracle

Ответ №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
  

Комментарии:

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

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

Ответ №2:

 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
  

Ответ №3:

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

 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 второй максимальной даты.

Ответ №4:

Выберите вторую максимальную дату из таблицы

  SELECT MAX(date) FROM tbl_date WHERE date NOT IN (SELECT MAX(date) FROM tbl_date )
        OR
        SELECT DISTINCT date FROM tbl_date  ORDER BY date DESC LIMIT 1,1;
        OR
        SELECT MAX(date) FROM ( SELECT date FROM tbl_date  MINUS SELECT MAX(date) FROM tbl_date)
  

Ответ №5:

   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
  

Ответ №6:

 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;
  

Ответ №7:

изменить 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)
  

Комментарии:

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