1

次のような WindData という名前の MySQL データベースがあります。

  • タイムスタンプ
  • 温度
  • 風速
  • 風向き

2 ~ 3 分ごとに新しい行を追加するので、1 年で多くの行ができます。

ここで、特定の期間 (4 日前、先月、過去 6 か月、2011-2012...) 内のデータをグラフとして表示したいと考えています。Google チャートを使用して、過去 1 年間の気温の変化を表示したいとします。次に、Google チャートには、使用できるデータポイントの量に上限があります。

次に、時間範囲 (2012-01-01 -- 2013-10-10) を指定する SQL クエリが必要です。

  • 一定数の行 (たとえば 200)
  • すべての行には、その間隔の平均値と最大値が含まれています。

アスキー アートの例:

...............1..............2...............+..............199..............200

テーブルの 1 つの行はどこ.にあり、数字は前のドットの平均値と最大値を表します。

私が達成しようとしていることを示すかもしれないいくつかの疑似コードは次のとおりです。

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-10-10

これにより、時間範囲全体の平均値を取得する 1 つの結果が得られます。したがって、上記の SQL ステートメントを異なる時間範囲で 200 回実行する SQL ステートメントをもう 1 つ作成する方法があるかもしれません。

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-02-1

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-02-01 AND timestamp < 2013-03-1 

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-03-01 AND timestamp < 2013-04-1

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-04-01 AND timestamp < 2013-05-1

...等々。

興味のある方は、こちらのヘルプを使用して、自作の気象観測所からの気象データを表示する www.surfvind.se でより良い図を提示します。

4

1 に答える 1

0

次のようなものを使用して、固定数の行を取得できます。

SELECT units.i + tens.i * 10 + hundreds.i AS aNumber
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 ) hundreds

このようなものを使用してさまざまな範囲を取得し、データと結合して各範囲内の値の数を取得できます。

編集 - 追加した詳細を使用するには:-

SELECT Sub1.aDate, AVG(temperature)
FROM 
(
    SELECT DATE_ADD('2012-01-01', INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) AS aDate
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds
) Sub1
LEFT OUTER JOIN
WindData
ON Sub1.aDate = DATE(WindData.`timestamp`)
GROUP BY Sub1.aDate

これは、2012-01-01 から始まる 1000 日の範囲を取得し (必要に応じてサブ選択でその範囲を簡単に制限できます)、それを 1 日の一時値と照合し、日付ごとの平均グループを取得します。

于 2013-10-13T11:19:03.283 に答える