Oracle SQL Query для сложного требования

У меня есть следующая таблица базы данных оракула ПОЛЬЗОВАТЕЛИ

enter image description here

I have to display the user status begin date&time and end date&time for each status.

В приведенном выше примере мне нужно показать, что STEVE BALE LOGGED_OUT с 01/08/2013 12:00:00 AM до 01/08/2013 5: 04: 24.736437 AM

и НЕСОВЕРШЕННО с 01/08/2013 5: 04: 24.736437 AM - 01/08/2013 6: 04: 24.736437 AM,

и ДОСТУПНО с 01/08/2013 6: 04: 24.736437 AM - 01/08/2013 7: 31: 08.591801 AM ...

аналогично для данного дня последняя запись новый статус, useR STEVE BALE LOGGED_OUT с 01/08/2013 11: 30: 50.724405 AM до 01/08/2013 11:59:59 PM ..

Спасибо за ваше время.

1
nl ja de

4 ответы

Это на самом деле довольно просто, потому что оракул имеет функцию lead() . Что-то вроде:

select t.*,
       lead(status_change_date) over (partition by user_name order by status_change_date) as end_status_time
from t

Для строки вы можете сделать что-то вроде:

select (t.user_name||' is '||t.new_status||' from '||
        to_char(status_change_date, 'mm/dd/yyyy hh:mi')+' to '||
        to_char(lead(status_change_date) over (partition by user_name order by status_change_date),
                'mm/dd/yyyy hh:mi')
       ) as thestring
from t 
3
добавлено
Спасибо, Гордон. Для первой записи мне нужно что-то вернуть. STEVE BALE LOGGED_OUT с 01/08/2013 12:00:00 AM до 01/08/2013 5: 04: 24.736437 AM.
добавлено автор user1430989, источник

Это на самом деле довольно просто, потому что оракул имеет функцию lead() . Что-то вроде:

select t.*,
       lead(status_change_date) over (partition by user_name order by status_change_date) as end_status_time
from t

Для строки вы можете сделать что-то вроде:

select (t.user_name||' is '||t.new_status||' from '||
        to_char(status_change_date, 'mm/dd/yyyy hh:mi')+' to '||
        to_char(lead(status_change_date) over (partition by user_name order by status_change_date),
                'mm/dd/yyyy hh:mi')
       ) as thestring
from t 
3
добавлено
Спасибо, Гордон. Для первой записи мне нужно что-то вернуть. STEVE BALE LOGGED_OUT с 01/08/2013 12:00:00 AM до 01/08/2013 5: 04: 24.736437 AM.
добавлено автор user1430989, источник

Вот пример, если я правильно понял. Используйте столбец даты и времени в разделе «Кому»:

Select 'STEVE BALE is LOGGED_OUT from: '||to_char(trunc(Sysdate), 'mm/dd/yyyy hh:mi:ss AM')||' to '||to_char((trunc(sysdate)+5/24)+04/1440, 'mm/dd/yyyy hh:mi:ss AM') "in_out"
From dual;

SQL> STEVE BALE is LOGGED_OUT from: 01/09/2013 12:00:00 AM to 01/09/2013 05:04:00 AM

Чтобы получить значения из prev./next, используйте Lag/Lead, как было предложено Гордоном.

0
добавлено

Вот пример, если я правильно понял. Используйте столбец даты и времени в разделе «Кому»:

Select 'STEVE BALE is LOGGED_OUT from: '||to_char(trunc(Sysdate), 'mm/dd/yyyy hh:mi:ss AM')||' to '||to_char((trunc(sysdate)+5/24)+04/1440, 'mm/dd/yyyy hh:mi:ss AM') "in_out"
From dual;

SQL> STEVE BALE is LOGGED_OUT from: 01/09/2013 12:00:00 AM to 01/09/2013 05:04:00 AM

Чтобы получить значения из prev./next, используйте Lag/Lead, как было предложено Гордоном.

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии