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

日付でグループ化し、count()が行を生成しない場合は0

    テーブルに日付がない場合は、日付を生成する方法が必要です。 generate_seriesを使用できます 機能:

    SELECT * FROM generate_series('2012-01-01'::timestamp, '2012-01-07 23:00', '1 hour') AS ts;
    

    これにより、次のような結果が得られます:

             ts          
    ---------------------
     2012-01-01 00:00:00
     2012-01-01 01:00:00
     2012-01-01 02:00:00
     2012-01-01 03:00:00
    ...
     2012-01-07 21:00:00
     2012-01-07 22:00:00
     2012-01-07 23:00:00
    (168 rows)
    

    残りのタスクは、次のような外部結合を使用して2つの選択を結合することです:

    select extract ( day from ts ) as day, extract ( hour from ts ) as hour,coalesce(count,0) as count from 
    (
        SELECT  extract ( day from date ) as day , extract ( hour from date ) as hr ,count(*)
        FROM    sr
        where date>'2012-01-01' and date <'2012-01-07'
        GROUP BY   extract ( day from date ) , extract ( hour from date )
    ) AS cnt 
     right outer join ( SELECT * FROM generate_series ( '2012-01-01'::timestamp, '2012-01-07 23:00', '1 hour') AS ts ) as dtetable on extract ( hour from ts ) = cnt.hr and extract ( day from ts ) = cnt.day 
     order by day,hour asc;
    


    1. これはデータベースをロックしますか?

    2. SQLServerを使用して空でない列を選択する

    3. デフォルト値で新しいSQL列を追加する

    4. HAVING句を使用してMySQLビューからSELECTすると、空の結果セットが返されます