Oracle SQL Query用于复杂的需求

时间:2013-01-09 17:02:33

标签: sql oracle

我有以下oracle数据库表USERS

enter image description here

我必须显示每个状态的用户状态开始日期和时间以及结束日期和时间。

从上面的例子我需要显示像STEVE BALE是LOGGED_OUT从01/08/2013 12:00:00 AM到01/08/2013 5:04:24.736437 AM

和UNAVAILABLE自2013年8月1日5:04:24.736437 AM至01/08/2013 6:04:24.736437 AM,

和AVAILABLE从2013年8月1日6:04:24.736437 AM到01/08/2013 7:31:08.591801 AM ......

类似于给定的一天最后一次记录新状态,使用R STEVE BALE是LOGGED_OUT从2013年8月1日11:30:50.724405 AM到01/08/2013 11:59:59 PM ..

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

这实际上非常简单,因为oracle具有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 

答案 1 :(得分: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行获取值,请使用Gordon建议的Lag / Lead。