以 30 分钟的时间间隔计算一天的用户数 oracle
Posted
技术标签:
【中文标题】以 30 分钟的时间间隔计算一天的用户数 oracle【英文标题】:User count in a day with 30minutes time interval oracle 【发布时间】:2017-09-07 17:46:02 【问题描述】:我希望以 30 分钟的时间间隔计算登录用户数。
总共有48个时间间隔。如果用户登录到数据库,那么他/她的start_time(登录)和end_time(注销时间),userid将被记录到表中 一个用户可以登录多个时间段。我正在获取 2017 年 7 月 12 日的数据 例如: id 为 2 的用户登录了 2 次,因此该用户的计数值为 2(在 12:02 到 12:07 和 11:46pm 到 11:51pm)同样,如果用户登录到某个时间段并退出到其他时间段,则计数将被视为两个时间间隔,即 2 例如:ID 为 3 的用户...
输入
user start_date end_time
1 12-JUL-17 12.02.09.430000000 AM 12-JUL-17 12.02.13.310000000 AM
2 12-JUL-17 12.02.13.323000000 AM 12-JUL-17 12.07.33.343000000 AM
3 12-JUL-17 12.06.19.203000000 AM 12-JUL-17 12.37.49.890000000 AM
4 12-JUL-17 12.07.33.357000000 AM 12-JUL-17 12.07.37.813000000 AM
5 12-JUL-17 12.07.37.813000000 AM 12-JUL-17 12.07.40.690000000 AM
6 12-JUL-17 12.07.40.707000000 AM 12-JUL-17 12.12.58.470000000 AM
7 12-JUL-17 12.12.58.487000000 AM 12-JUL-17 12.13.01.937000000 AM
8 12-JUL-17 12.13.01.950000000 AM 12-JUL-17 12.18.22.193000000 AM
9 12-JUL-17 12.13.20.267000000 AM 12-JUL-17 12.45.38.013000000 AM
2 12-JUL-17 11.46.17.827000000 PM 12-JUL-17 11.51.32.267000000 PM
3 12-JUL-17 11.47.03.497000000 PM 13-JUL-17 12.20.17.167000000 AM
输出
count(id) interval
9 1
2 2
0 47
2 48
共有 48 个间隔(每个间隔 30 分钟)
count(id) interval
9 1 (12 - 12:30 am)
2 2 (12:30 - 1:00 am)
. .
. .
. 47 (11:00 - 11:30 pm)
2 48 (11:30 - 12:00 am)
查询
With Periods as
(
select to_timestamp(:TheDate, 'yyyy-mm-dd hh24:mi:ss') + (level-1)/48 as p_start, to_timestamp(:TheDate, 'yyyy-mm-dd hh24:mi:ss') + (level)/48 as p_end, level as p_id
from dual connect by level<=48
)
select p.*, count(distinct t1.id) as distinct_users
from Periods p
left join Input t1
on t1.start_date < p_end
and t1.end_date >= p_start
group by p.p_id, p.p_start, p.p_end
我已经玩过这个查询,但它没有给我一个准确的答案 注意:两个日期列都在时间戳中
查询提示:https://***.com/users/2144048/johnhc
【问题讨论】:
您期望的准确答案是什么? 关于此类问题中总是出现的“边界问题”的问题。假设用户在 10:00 登录并在 10:30 整点注销。此用户是否在 9:30 到 10:00 的时间间隔内“登录”?她在 10:30 到 11:00 的时间间隔内“登录”了吗?如果不是,您必须准确指定每个可能的边界条件必须如何处理。 @wolfrevokcatsthankx fr 表现出你的兴趣......我已经显示了你可以看到的输出我只希望用户在 48 个间隔内计数 @mathguy 这是一个很好的问题。首先让我通过查看我的全部数据来弄清楚,然后我会告诉你!! 嘿 @mathguy,如果用户在 (10:00 - 10:30) 登录,那么他/她将进入 10 - 10:30 间隔和 10:30 -11:00 到如果用户在 10:00 - 10:29:59 登录,则使用 COUNT 2,那么他/她将只进入一个时间间隔,即 (10 - 10:30)。但是假设用户在 10:00 登录并在 10:31 注销,那么他/她将处于 2 个间隔(10 - 10:30 和 10:30 - 11:00),因为用户已登录间隔(10:30 - 11:00)1 分钟,这将被计算在内。希望你能理解!! :) 【参考方案1】:我会通过一个针对 ALL_OBJECTS WHERE rownum
SELECT intervals.interval, COUNT(DISTINCT "USER") FROM (SELECT rownum AS interval FROM all_objects WHERE rownum <= 48) intervals
LEFT OUTER JOIN test2 ON intervals.interval BETWEEN EXTRACT(HOUR FROM start_date) * 2 + FLOOR(EXTRACT(MINUTE FROM start_date)/30) + 1
AND CASE WHEN EXTRACT(DAY FROM start_date) != EXTRACT(DAY FROM end_time) THEN 48 ELSE EXTRACT(HOUR FROM end_time) * 2 + FLOOR(EXTRACT(MINUTE FROM end_time)/30) + 1 END
GROUP BY intervals.interval
ORDER BY intervals.interval
【讨论】:
以上是关于以 30 分钟的时间间隔计算一天的用户数 oracle的主要内容,如果未能解决你的问题,请参考以下文章
Django celery crontab 每 30 秒 - 有可能吗?
如何计算从上午 8:00 到晚上 8:00 以 15 分钟为间隔的可用时间?