如何在SQLite中生成时间间隔查询?

时间:2009-07-26 12:47:59

标签: sql sqlite

我有一个基于事件的表格,我希望按分钟生成查询,以查看发生的事件数量。

例如,我有一个事件表,如:

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

3 个答案:

答案 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>;