3

次のSQLクエリがあります:

    SELECT DATE(time), ROUND(AVG(out_temp),2)
    FROM data_table
    WHERE id= 1 AND time BETWEEN '2012-08-18' AND '2012-08-30'
    GROUP BY DATE(time)
    ORDER BY time ASC

これは以下を返します:

    date         avg_temp
    2012-08-18   11.41
    2012-08-19   5.90
    2012-08-28   11.22
    2012-08-29   10.07

これまでのところすべてうまくいきます...しかし、次のような定数値で不足している日付を追加したいと思います:

    date         avg_temp
    2012-08-18   11.41
    2012-08-19   5.90
    2012-08-20   <value>
    ...          ...
    2012-08-27   <value>
    2012-08-28   11.22
    2012-08-29   10.07

クエリをどのように変更すればよいですか? 誰かがこの問題を手伝ってくれませんか? 日付値が事前に入力された別のカレンダー テーブルの作成に関する投稿をいくつか読みましたが、それでも機能しませんでした。

4

2 に答える 2

1

データ テーブルに実際にすべての日付のデータがある場合は、次のようにすることができます。

SELECT thedate, coalesce(ROUND(AVG(out_temp),2), <value>)
FROM (select distinct date(time) as thedate
      from data_table
     ) dates left outer join
     data_table dt
     on date(time) = thedates.date
WHERE id= 1 AND thedate BETWEEN '2012-08-18' AND '2012-08-30'
GROUP BY thedate
ORDER BY time ASC

必要なのは、必要な日付を生成するための駆動テーブルです。その後、このテーブルに左結合して、必要な集計を取得できます。COALESCE 関数を使用すると、デフォルト値を入力できます。

于 2012-09-12T17:42:20.983 に答える
1

必要なすべての日付を含むテーブルを作成し、LEFT JOIN を実行します。例えば

CREATE TABLE calendar ( day DATE PRIMARY KEY );

次に、おそらくプログラミング言語 (疑似コード) でループを使用して、テーブルに挿入します。

for day in day_range( start_date, end_date ):
   query( 'INSERT INTO calendar VALUES ( ' + day + ' );' );

そして、LEFT JOIN を実行します。

SELECT DATE(day), ROUND(AVG(out_temp),2)
FROM data_table LEFT JOIN calendar ON data_table.time = calendar.day
WHERE id= 1 AND day BETWEEN '2012-08-18' AND '2012-08-30'
GROUP BY DATE(day)
ORDER BY day ASC
于 2012-09-12T17:44:14.300 に答える