2009-05-13 4 views
1

私はPythonアプリケーションを持っています。それは、WebからのWebスクレイパーによって検索された事柄に関する完全なSQLiteデータベースを持っています。このデータには、Unixタイムスタンプのような時間 - 日付グループが、それらのために予約された列に含まれます。私は物事を行った組織の名前を取得し、それらの頻度を数えますが、毎週(すなわち604,800秒)にこれを行うためにデータがあります。フィールド値の増分ごとにどのようにGROUP BYを行うのですか?

擬似コード:

for each 604800-second increment in time: 
select count(time), org from table group by org 

は基本的に私は何をしようとしている目的は、どのように分布を分析することです604800のステップ値で、時間の欄にソートされたリストのようなデータベースを反復処理されます時間の経過とともに変化した組織全体の割合。

可能であれば、私はデータベースからすべての行を引き出し、Pythonで処理するのを避けたいと思います。これは非効率的で、b)データがデータベースにあると考えられるので無意味です。

答えて

1

それはweeknumberを発見し、Oracleではオフセット

SELECT org, ROUND(time/604800) - week_offset, COUNT(*) 
FROM table 
GROUP BY org, ROUND(time/604800) - week_offset 

を減算して、時間が日付列だった場合、私は次のように使用し、私はこのアプローチはほとんどのデータベースのために働くべきだと思うのSQLiteに精通していない:

SELECT org, TO_CHAR(time, 'YYYY-IW'), COUNT(*) 
FROM table 
GROUP BY org, TO_CHAR(time, 'YYYY-IW') 

SQLiteにはおそらく目で見やすいこの種のSELECTを可能にする同様の機能があります。

+0

はい、日付と時刻の文字列(およびそれがあなたのものであればunixepoch修飾子)とunix-epoch番号の切り捨てに基づいたより簡単な方法をフォーマットするのにstrftime関数を使うことができます。 –

+0

ありがとう!これが解決策です。 TO_CHARはsqliteには存在しませんが、strftime関数ではこれをソートすることができました。 – user106514

1

エポックからすべての週を一覧表示するテーブルを作成し、イベントテーブルにJOINというテーブルを作成します。

CREATE TABLE Weeks (
    week INTEGER PRIMARY KEY 
); 

INSERT INTO Weeks (week) VALUES (200919); -- e.g. this week 

SELECT w.week, e.org, COUNT(*) 
FROM Events e JOIN Weeks w ON (w.week = strftime('%Y%W', e.time)) 
GROUP BY w.week, e.org; 

年間52-53週間しかありません。 Weeksテーブルに100年間置いても、それはまだ小さなテーブルです。

1

これをセットベースの方法(これはSQLがうまくいくものです)で行うには、時間単位のセットベースの表現が必要です。これは、一時テーブル、永続テーブル、または派生テーブル(サブクエリ)です。私はSQLiteにあまり慣れていないし、UNIXで作業しているのでしばらくしている。 UNIXのタイムスタンプは、設定された日時から#秒だけですか? (データベースを持っていると便利です)標準のカレンダーテーブルを...使用

SELECT 
    C1.start_time, 
    C2.end_time, 
    T.org, 
    COUNT(time) 
FROM 
    Calendar C1 
INNER JOIN Calendar C2 ON 
    C2.start_time = DATEADD(dy, 6, C1.start_time) 
INNER JOIN My_Table T ON 
    T.time BETWEEN C1.start_time AND C2.end_time -- You'll need to convert to timestamp here 
WHERE 
    DATEPART(dw, C1.start_time) = 1 AND -- Basically, only get dates that are a Sunday or whatever other day starts your intervals 
    C1.start_time BETWEEN @start_range_date AND @end_range_date -- Period for which you're running the report 
GROUP BY 
    C1.start_time, 
    C2.end_time, 
    T.org 

カレンダー表は、あなたが好きな形取ることができますので、あなたはSTART_TIMEとEND_TIMEのためにそれにUNIXタイムスタンプを使用することができます。考えられる範囲内のすべての日付を事前に入力するだけです。 1900年1月1日から9999年12月31日に行くことさえ、ひどく大きなテーブルではありません。これは、多くのレポートタイプのクエリに便利です。

最後に、このコードはT-SQLなので、おそらくDATEPARTとDATEADDをSQLiteの同等のものに変換する必要があります。

関連する問題