У меня есть таблица с указанными ниже столбцами. Я хочу получить предыдущий статус клиента. Как только идентификатор клиента может иметь несколько записей
Customer_id status start_date end_date Active
1 Member 01-JAN-18 04-FEB-18 N
1 Explorist 05-FEB-18 30-APR-18 N
1 Globalist 01-MAY-18 31-DEC-99 Y
Желаемый результат
Customer _id Previous_status end_date
1 Explorist 30-APR-18
Попробуйте выполнить запрос ниже, используя ключевое слово QUALIFY и ROW_NUMBER ():
SELECT a.* from table a
QUALIFY ROW_NUMBER OVER(PARTITION BY customer_id order by start_date desc) = 2
Ключевое слово QUALIFY не работает с Oracle. Это какое-то ключевое слово Teradata?
Вы можете использовать подзапрос для другой базы данных: - select * from (SELECT a. *, ROW_NUMBER OVER (PARTITION BY customer_id order by start_date desc) sno from table a) where sno = 2
@Johan: Да, это проприетарный фильтр, это фильтр после оконных агрегатов, аналогичный фильтру после агрегирования с использованием HAVING.
Ниже запрос должен работать.
SELECT * from (
SELECT a.*,
ROW_NUMBER() over (partition by customer_id order by start_date desc) rn
from table a )
where rn =2
Вы можете использовать запрос ниже, и я думаю, это очень просто и сработало для меня,
select * from customer order by end_date desc limit 1,1
Рассмотрим этот вопрос: Выбрать N-ю строку из таблицы в Oracle
В вашем случае это будет:
select * from (select a.*, rownum rnum from (select * from <your table name>
order by <start_date or end_date> desc) a where rownum <= 2) where rnum >= 2;
Если вы используете Oracle DataBase, попробуйте выполнить следующий запрос с использованием функции ROW_NUMBER (): Предположим, что имя таблицы - клиент
SELECT TEMP.CUSTOMER_ID ,TEMP.STATUS ,TEMP.START_DATE ,TEMP.END_DATE ,TEMP.ACTIVE FROM( SELECT ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY CUSTOMER_ID ASC,START_DATE DESC) AS "ROW_NUM" ,CUSTOMER_ID ,STATUS ,START_DATE ,END_DATE ,ACTIVE FROM CUSTOMER) TEMP WHERE TEMP."ROW_NUM" = 2;
Это неправильный вопрос для SO, покажите нам свою попытку решить эту проблему вместо того, чтобы просто ожидать, что другие сделают эту работу за вас.