0

統計モジュールを作成中です。私の仕事の 1 つは、過去 1 週間の登録ユーザー数の合計でプロットを作成することです。
問題は、私が担当しているサービスは少数の顧客しか使用していないため、誰も登録していない日が頻繁に発生することです。

テーブルの説明 (簡略化) は次のとおりです。

TABLE users:
============
id serial NOT NULL,
date_created timestamp with timezone NOT NULL DEFAULT NOW()

過去 7 日間の合計を取得するには、次を使用します

SELECT
    COUNT(id) as ile,
    DATE_TRUNC('day', date_created) as day
FROM
    users
WHERE
    date_created >= now() - INTERVAL '7 days'
GROUP BY 2
ORDER BY 2

すべて正常に動作し、Postgres は次のように返します。

ile | day
===========================
2   | "2013-09-23 00:00:00"
1   | "2013-09-25 00:00:00"

ただし、カウントが 0 の日付は省略されます。もちろん、このクエリの結果 (この場合は PHP + Symfony) を解析する必要があるため、目的の日付範囲を反復処理して空白を埋めることができますが、PostgreSQL にそれを実行するように依頼する簡単な方法があるかどうか疑問に思っています。次のようなものを返します。

ile | day
===========================
2   | "2013-09-23 00:00:00"
0   | "2013-09-24 00:00:00"
1   | "2013-09-25 00:00:00"
0   | "2013-09-26 00:00:00"
0   | "2013-09-27 00:00:00"
0   | "2013-09-28 00:00:00"
0   | "2013-09-29 00:00:00"
4

1 に答える 1

1

現時点ではテストできませんが、generate_series()関数を使用できます。

select
    count(u.id) as ile,
    d.day
from generate_series('2013-09-23'::date, '2013-09-29'::date, '1d') as d(day)
    left outer join users as u on u.date_created >= d.day and u.date_created < d.day + '1d'::interval
    -- or left outer join users as u on date_trunc('day', u.date_created) = d.day
    -- but I think that >= and < will be faster if you have index on `date_created`
group by d.day
于 2013-10-21T11:48:28.450 に答える