sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL-統計データの取得

    集計関数 を調べる必要があります (最小、最大、カウント、平均)、これは GROUP BY 。日付ベースの集計の場合、 date_trunc も便利です。

    たとえば、これは1日あたりの行数を返します:

    SELECT date_trunc('day', date_time) AS day_start,
           COUNT(id) AS user_count FROM tb_user
        GROUP BY date_trunc('day', date_time);
    

    次に、次のようなものを使用して1日の平均を計算できます( CTEを使用) ):

    WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
           COUNT(id) AS user_count FROM tb_user
        GROUP BY date_trunc('day', date_time))
    SELECT AVG(user_count) FROM daily_count;
    

    'week'を使用する 週ごとのカウントの日ではなく、など(date_truncを参照) ドキュメント)。

    編集: (次のコメント:2012年5月1日までの平均、つまり6日以前)

    WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
           COUNT(id) AS user_count
        FROM tb_user
           WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06') 
        GROUP BY date_trunc('day', date_time))
    SELECT SUM(user_count)/(DATE('2012-01-06') - DATE('2012-01-01')) FROM daily_count;
    

    この場合、上記の内容は非常に複雑です。これで同じ結果が得られるはずです:

    SELECT COUNT(id)/(DATE('2012-01-06') - DATE('2012-01-01'))
        FROM tb_user
           WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06');
    

    編集2: 編集後、あなたが求めているのは、月/週/日ごとのグループではなく、データベースが存在する全期間の単一のグローバル平均にすぎないと思います。

    これにより、1日あたりの平均行数がわかります:

    WITH total_min_max AS (SELECT
            COUNT(id) AS total_visits,
            MIN(date_time) AS first_date_time,
            MAX(date_time) AS last_date_time,
        FROM tb_user)
    SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
        FROM total_min_max
    

    last_date_timeを置き換えます NOW()を使用 最近の訪問がない場合は、最後の訪問までではなく、現在までの時間の平均を作成します。)

    次に、毎日、毎週、および「毎月」の場合:

    WITH daily_avg AS (
        WITH total_min_max AS (SELECT
                COUNT(id) AS total_visits,
                MIN(date_time) AS first_date_time,
                MAX(date_time) AS last_date_time,
            FROM tb_user)
        SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
            FROM total_min_max)
    SELECT
             users_per_day,
             (users_per_day * 7) AS users_per_week,
             (users_per_month * 30) AS users_per_month
        FROM daily_avg
    

    そうは言っても、そのような統計から導き出す結論は、特にそれがどのように変化するかを見たい場合は、あまり良くないかもしれません。

    また、1か月に30日を想定するのではなく、1日あたりのデータを正規化します(すべての日が24時間であるとは限らないため、1時間あたりではない場合 )。 2011年1月に1日あたり10回、2011年2月に1日あたり10回の訪問があるとします。これにより、1月に310回、2月に280回の訪問が発生します。訪問者数が10%減少したため、2月に問題が発生しましたが、実際にはそうではありません。




    1. ローカルの既存のタイプからdblink列定義リストを指定します

    2. SQLite Listview onclickは、dbをフィルターして開き、新しいアクティビティを生成します

    3. 値のテキストボックスをmysqlデータベースに挿入します

    4. Hibernate/PostgreSQLでユーロ記号をLOB文字列プロパティに格納できません