Sql-запрос для получения второй последней записи из таблицы

У меня есть таблица с указанными ниже столбцами. Я хочу получить предыдущий статус клиента. Как только идентификатор клиента может иметь несколько записей

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

Это неправильный вопрос для SO, покажите нам свою попытку решить эту проблему вместо того, чтобы просто ожидать, что другие сделают эту работу за вас.

Joakim Danielson 02.05.2018 14:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
86
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Попробуйте выполнить запрос ниже, используя ключевое слово 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?

user9634699 02.05.2018 14:27

Вы можете использовать подзапрос для другой базы данных: - select * from (SELECT a. *, ROW_NUMBER OVER (PARTITION BY customer_id order by start_date desc) sno from table a) where sno = 2

Leo 02.05.2018 14:35

@Johan: Да, это проприетарный фильтр, это фильтр после оконных агрегатов, аналогичный фильтру после агрегирования с использованием HAVING.

dnoeth 02.05.2018 15:08

Ниже запрос должен работать.

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;

Другие вопросы по теме