0

私は次のクエリを持っています:

SELECT created_at::DATE, count (*) 
FROM messages      
WHERE city = 'los angeles'     
GROUP BY created_at::DATE

これはうまくいきます。課題は、特定の日付のメッセージがない場合、その日付のレコードを返さないことです。特定の日付から今日までのすべての日について、上記のクエリで日付を返し、その日付にメッセージがない場合は0を返すにはどうすればよいですか?

PostgreSQL8.3での作業。

ありがとう!

4

3 に答える 3

2

メッセージテーブルにない日付が含まれている可能性があるため、関心のあるすべての日付のテーブルが必要なようです。このテーブルがある場合、またはビルドしている場合は、メッセージテーブルとの結合を残し、そのテーブルの列をカウントします。結合に一致するものがない場合は0が返されます。

select d.created_at, count(m.messageId)
from possibleDates d
left join messages m
    on d.created_at = m.created_at
group by d.created_at
于 2011-07-15T21:44:36.097 に答える
2

一般的な方法は、すべての日付を含む別のカレンダーテーブルを作成し、日付列でテーブルに結合したままにしてから、ある種のifnull(x、0)ステートメント[PostgreSQLの関数が何であれ]またはcaseステートメントを作成することです。日付の左結合がnullを返す場合は0を返し、nullでない場合は1を返します。次に、通常のグループ化を実行し、count()の代わりにSUM(x)を使用できます。

于 2011-07-15T21:41:59.120 に答える
2

多くの場合、シリーズの欠落しているエントリにゼロを入力する場合、PostgreSQLの答えにはgenerate_series関数が含まれます。(Stackoverflowで同様の質問と回答を検索してください。)あなたの場合は、次のようなものを使用してください。

SELECT ts::date AS date, coalesce(count, 0) AS count
FROM
  (SELECT created_at::date, count(*)
   FROM messages
   WHERE city = 'los angeles'
   GROUP BY created_at::date) AS m
  RIGHT JOIN
  (SELECT *
   FROM generate_series(timestamp '2011-07-01',
                        timestamp 'today',
                        interval '1 day')) AS series(ts)
  ON m.created_at = series.ts
ORDER BY 1;
于 2011-07-17T18:18:12.967 に答える