#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
это функция Oracle3. @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. Пожалуйста, посмотрите на мой вопрос, то, что вы сказали, уже сделано.