【发布时间】:2013-10-28 15:53:38
【问题描述】:
我在 Oracle 中有一个跟踪用户登录和注销/超时的表。我正在进行选择查询,以按小时显示过去 7 天的并发用户数。我有一个基本查询,但它没有正确计算会话超过午夜的用户。
关于数据/我的查询的一些信息:
- Logintracking 保存所有用户登录操作,例如登录/注销/超时操作。每个操作都位于单独的行中。
-
Attemptdate是动作发生的时间 -
Attemptresult7是登录操作的结果(LOGIN/LOGOUT/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?
【问题讨论】: