1

私はPythonアプリケーションを持っています。これには、Web スクレーパーによって Web から取得された、発生したことに関するデータでいっぱいの SQLite データベースがあります。このデータには、時間と日付のグループが Unix タイムスタンプとして含まれており、それらのために予約された列に含まれています。あることを行った組織の名前を取得し、その頻度を数えたいのですが、データを持っている週ごと (つまり 604,800 秒) についてこれを行います。

擬似コード:

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

基本的に、私がやろうとしているのは、時間列で並べ替えられたリストのようにデータベースを反復処理することです。ステップ値は 604800 です。目的は、全体のさまざまな組織の分布が時間の経過とともにどのように変化したかを分析することです。

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

4

3 に答える 3

1

SQLite に慣れていないので、週番号を見つけてオフセットを差し引くので、このアプローチはほとんどのデータベースでうまくいくと思います。

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

Oracleでは、時間が日付列である場合、次を使用します。

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

SQLite にはおそらく、この種の SELECT を可能にする同様の機能があり、見た目が簡単です。

于 2009-05-13T20:14:00.163 に答える
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;

1 年に 52 ~ 53 週間しかありません。Weeks テーブルに 100 年間データを入力したとしても、それはまだ小さなテーブルです。

于 2009-05-13T18:30:03.080 に答える
1

これをセットベースの方法 (SQL が得意とする方法) で行うには、時間の増分をセットベースで表現する必要があります。これは、一時テーブル、永続テーブル、または派生テーブル (つまり、サブクエリ) のいずれかです。私は SQLite にあまり詳しくありません。また、UNIX を使用するのは久しぶりです。UNIX のタイムスタンプは、設定された日付/時刻からわずか # 秒ですか? 標準の Calendar テーブル (データベースにあると便利です) を使用して...

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

Calendar テーブルは任意の形式を取ることができるため、start_time と end_time に UNIX タイムスタンプを使用できます。使用する可能性のある考えられる範囲のすべての日付を事前に入力するだけです。1900-01-01 から 9999-12-31 に変更しても、それほど大きなテーブルにはなりません。多くのレポート タイプのクエリに役立ちます。

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

于 2009-05-13T18:36:16.407 に答える