我有一个基于事件的表格,我希望按分钟生成查询,以查看发生的事件数量。
例如,我有一个事件表,如:
CREATE TABLE events (
session_id TEXT,
event TEXT,
time_stamp DATETIME
)
我已将其转换为以下类型的表:
CREATE TABLE sessions (
session_id TEXT,
start_ts DATETIME,
end_ts DATETIME,
duration INTEGER
);
现在我想创建一个查询,该查询将会话按特定分钟内活动的计数进行分组。在哪里我基本上会得到类似的东西:
TIME_INTERVAL ACTIVE_SESSIONS
------------- ---------------
18:00 1
18:01 5
18:02 3
18:03 0
18:04 2
答案 0 :(得分:2)
好的,我想我得到了更多我想要的东西。它没有考虑空的间隔,但它足以满足我的需要。
select strftime('%Y-%m-%dT%H:%M:00.000',start_ts) TIME_INTERVAL,
(select count(session_id)
from sessions s2
where strftime('%Y-%m-%dT%H:%M:00.000',s1.start_ts) between s2.start_ts and s2.end_ts) ACTIVE_SESSIONS
from sessions s1
group by strftime('%Y-%m-%dT%H:%M:00.000',start_ts);
这将在数据覆盖的时间段内生成每分钟一行,其中包含已启动但尚未完成的会话数(start_ts)的计数(end_ts)。
答案 1 :(得分:1)
PostgreSQL允许以下查询。
与您的示例相比,这会返回当天的其他列,并且它会忽略没有发生任何事情的分钟数(count = 0)。
select
day, hour, minute, count(*)
from
(values ( 0),( 1),( 2),( 3),( 4),( 5),( 6),( 7),( 8),( 9),
(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),
(40),(41),(42),(43),(44),(45),(46),(47),(48),(49),
(50),(51),(52),(53),(54),(55),(56),(57),(58),(59))
as minutes (minute),
(values ( 0),( 1),( 2),( 3),( 4),( 5),( 6),( 7),( 8),( 9),
(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
(20),(21),(22),(23))
as hours (hour),
(select distinct cast(start_ts as date) from sessions
union
select distinct cast(end_ts as date) from sessions)
as days (day),
sessions
where
(day,hour,minute)
between (cast(start_ts as date),extract(hour from start_ts),extract(minute from start_ts))
and (cast(end_ts as date), extract(hour from end_ts), extract(minute from end_ts))
group by
day, hour, minute
order by
day, hour, minute;
答案 2 :(得分:1)
这不完全是您的查询,但我认为它可以提供帮助。你看过SQLite R-Tree module了吗?这将允许您在开始/停止时创建虚拟索引:
CREATE VIRTUAL TABLE sessions_index USING rtree (id, start, end);
然后你可以搜索:
SELECT * FROM sessions_index WHERE end >= <first minute> AND start <= <last minute>;