2013-01-09 71 views
1

我有以下的Oracle數據庫表USERS的Oracle SQL查詢的複雜需求

enter image description here

我要顯示用戶狀態的開始日期&對各狀態的時間和結束日期&時間。

從上面的例子我需要顯示像史蒂夫BALE是從2013年1月8日12:00:00 AM到2013年1月8日5 LOGGED_OUT:04:24.736437 AM

和不可用從01/08/2013 5:04:24.736437 AM至01/08/2013 6:04:24.736437 AM,

和從2013年8月1日開始6:04:24.736437上午到01/08/2013 7:31: 08.591801 AM ...

類似於給定日期最後一個記錄的新狀態,請使用R STEVE BALE LOGGED_OUT從01/08/2013 11:30:50.724405 AM到01/08/2013 11:59:59 PM ..

謝謝你的時間。

回答

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 
+0

謝謝戈登。對於第一個記錄,我需要返回一些東西。STEVE BALE是LOGGED_OUT,從01/08/2013 12:00:00 AM到01/08/2013 5:04:24.736437 AM。 – user1430989

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行使用滯後/超前得值。