0
我在Oracle中有一個跟蹤用戶登錄和註銷/超時的表。我正在做一個選擇查詢來顯示過去7天內每小時的併發用戶數。我有一個基本查詢,但它不能正確計算會話跨越午夜的用戶。的信息對數據併發用戶報告
位/我的查詢:
- Logintracking保存所有用戶的登錄操作,如登錄/註銷/超時行爲。每個操作都在單獨的行上。
Attemptdate
是當動作發生Attemptresult7
是登錄操作(登錄/註銷/ TIMEOUT)的結果Maxsessionuid
是用戶的會話ID,這可以用來登錄與註銷鏈接/時間到。- 我正在使用左外部自加入來匹配基於會話ID的登出與登錄。由於用戶可能仍然登錄,因此我使用sysdate替換了空註銷日期。
- 我按年/月/日分組數據,並刪除用戶可能使用不同的兩次登錄的任何記錄。在此報告中,登錄10次的同一用戶僅被視爲1個併發用戶。 (這部分也不是真正的工作,因爲我的獨特之處在於登錄和註銷時間,這可能會話之間會有所不同。我真的需要爲同一個用戶組合重疊會話...)
- 我數 :通過查看每個小時從0到23是他們的登錄和註銷之間的併發用戶數
- 我的Oracle查詢到目前爲止(這當然不會爲跨天的會議工作)
Select Lyear,
Lmonth,
Lday,
Sum(Case When 0 Between Lhour And Ohour Then 1 Else 0 End) H00,
Sum(CASE WHEN 1 between LHour and OHour Then 1 Else 0 End) H01,
Sum(CASE WHEN 2 between LHour and OHour Then 1 Else 0 End) H02,
Sum(Case When 3 Between Lhour And Ohour Then 1 Else 0 End) H03,
Sum(CASE WHEN 4 between LHour and OHour Then 1 Else 0 End) H04,
Sum(CASE WHEN 5 between LHour and OHour Then 1 Else 0 End) H05,
Sum(CASE WHEN 6 between LHour and OHour Then 1 Else 0 End) H06,
Sum(CASE WHEN 7 between LHour and OHour Then 1 Else 0 End) H07,
Sum(CASE WHEN 8 between LHour and OHour Then 1 Else 0 End) H08,
Sum(Case When 9 Between Lhour And Ohour Then 1 Else 0 End) H09,
Sum(CASE WHEN 10 between LHour and OHour Then 1 Else 0 End) H10,
Sum(CASE WHEN 11 between LHour and OHour Then 1 Else 0 End) H11,
Sum(CASE WHEN 12 between LHour and OHour Then 1 Else 0 End) H12,
Sum(CASE WHEN 13 between LHour and OHour Then 1 Else 0 End) H13,
Sum(CASE WHEN 14 between LHour and OHour Then 1 Else 0 End) H14,
Sum(CASE WHEN 15 between LHour and OHour Then 1 Else 0 End) H15,
Sum(Case When 16 Between Lhour And Ohour Then 1 Else 0 End) H16,
Sum(Case When 17 Between Lhour And Ohour Then 1 Else 0 End) H17,
Sum(Case When 18 Between Lhour And Ohour Then 1 Else 0 End) H18,
Sum(CASE WHEN 19 between LHour and OHour Then 1 Else 0 End) H19,
Sum(Case When 20 Between Lhour And Ohour Then 1 Else 0 End) H20,
Sum(Case When 21 Between Lhour And Ohour Then 1 Else 0 End) H21,
Sum(CASE WHEN 22 between LHour and OHour Then 1 Else 0 End) H22,
Sum(Case When 23 Between Lhour And Ohour Then 1 Else 0 End) H23
From (
Select Distinct L1.Userid,
Extract(Year From L1.Attemptdate) Lyear,
Extract(Month From L1.Attemptdate) Lmonth,
Extract(Day From L1.Attemptdate) Lday,
--You can't extract HOUR from a date, must be a timestamp
Extract(Hour From Cast(L1.Attemptdate As Timestamp)) As Lhour,
Extract(Hour From Cast(NVL(L2.Attemptdate,SYSDATE) As Timestamp)) As OHour
From Maximo.Logintracking L1
LEFT OUTER JOIN Maximo.Logintracking L2 On
L1.Maxsessionuid = L2.Maxsessionuid
Where L1.Attemptresult7 = 'LOGIN' And L2.Attemptresult7 != 'LOGIN'
And L1.Attemptdate > Trunc(Sysdate)-7
And L2.Attemptdate > Trunc(Sysdate)-7) Sessions
Group By Lyear, Lmonth, Lday
ORDER By LYear, LMonth, LDay
查詢不必像現在這樣保留任何內容。但最終的結果應該是,我可以按小時查看併發用戶的x天數據。
相關:How to count the number of concurrent users using time interval data?
謝謝了。我將Hours_Of_Last_7_days更改爲使用TRUNC(SYSDATE,'DDD'),我還將內部選擇更改爲使用Trunc(SYSDATE,'DDD') - 8而不是-7,因爲它切斷了在第一天,但在午夜後結束。 – Peter