2009-07-26 14 views
2

私は発生したイベントの数を分単位でクエリを生成したいイベントベースのテーブルを持っています。SQLiteで時間間隔のクエリを作成するにはどうすればよいですか?

は例えば、私のようなイベントテーブルを持っている:

CREATE TABLE sessions (
    session_id TEXT, 
    start_ts  DATETIME, 
    end_ts  DATETIME, 
    duration  INTEGER 
); 

は今、私はグループだろうクエリを作成したい:私はテーブルの次の型に変換している

CREATE TABLE events (
    session_id TEXT, 
    event  TEXT, 
    time_stamp DATETIME 
) 

特定の1分間にアクティブだったセッションの数だけセッションを開始します。私が本質的に次のようなものを返すところ:

TIME_INTERVAL ACTIVE_SESSIONS 
------------- --------------- 
18:00   1 
18:01   5 
18:02   3 
18:03   0 
18:04   2 
+0

と"end_ts"? – vog

+0

私はそれを残していた可能性があります...それは質問にドイツ語ではありません。私の実際の世界の状況では、私はこの期間のクエリを実行するときにクエリの違いを計算する必要がないように、これのアナログを使用します。 – Kitson

+0

次の変更までの間隔を正確に計算する方が良いのではないでしょうか?行は "18:00:32 | 18:04:17 | 1"のようになり、計算がはるかに簡単になります。この "start | end | count"スタイルの情報は、チャートなどの描画を簡単にします。 – vog

答えて

1

[OK]をクリックします。それは空の間隔を説明しませんが、私は必要なものに十分です。

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

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;
+0

拡張子generate_seriesを使用できます。 "値(1)、(2)、..."の代わりに範囲(開始、終了、ステップ): '.load generate_series.dll' ' SELECT hours.value、minute.value from generate_series 59,1)を分として; JOIN generate_series(1,24,1)時間 – user2173403

1

これは正確にはあなたのクエリではありませんが、私はそれが助けになると思います。 SQLite R-Tree moduleを調べましたか?そして、あなたが経由で検索でき

CREATE VIRTUAL TABLE sessions_index USING rtree (id, start, end); 

:これは、開始/停止時に仮想インデックスを作成することができるようになるあなたはすでに「start_ts」を持っている場合は、「期間」の意味は何

SELECT * FROM sessions_index WHERE end >= <first minute> AND start <= <last minute>; 
関連する問題