1

MySQL データベースに温度を保存しました。テーブルは と呼ばれtemperaturesます。たとえば、列dtimeとが含まれていますtemperature。最初のものは温度が測定された時間 (列の種類はDATETIME) で、後者は明らかに温度 (種類はFLOAT) です。

現在、次のクエリを使用して、特定の期間の気温を取得しています。

SELECT dtime, temperature 
FROM temperatures 
WHERE dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
ORDER BY dtime DESC

その日の平均気温を結果に追加したいと思います。以下を試しました。

SELECT 
    dtime AS cPVM,
    temperature,
    (
        SELECT AVG(temperature) 
        FROM temperatures 
        WHERE DATE(dtime) = DATE(cPVM)
    ) AS avg
FROM temperatures 
WHERE dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
ORDER BY dtime DESC

正常に動作しますが、これは本当に遅いです。その期間の結果のフェッチには約 5 秒かかりますが、最初の結果 (平均なし) は 0.03 秒で完了します。

SELECT DATE(dtime), AVG(temperature) 
FROM temperatures 
WHERE DATE(dtime) BETWEEN "2012-11-15" AND "2012-11-30" 
GROUP BY DATE(dtime) 
ORDER BY dtime DESC

ただし、これは 0.04 秒で完了します。

平均気温をより効率的に取得するにはどうすればよいですか?

4

2 に答える 2

1

相関サブクエリの代わりに結合を使用します。

SELECT dtime, temperature, avg_temperature
FROM temperatures 
JOIN (
    SELECT DATE(dtime) AS date_dtime, AVG(temperature) AS avg_temperature
    FROM temperatures
    WHERE dtime >= '2012-11-15' AND dtime < '2012-12-01'
    GROUP BY DATE(dtime)
) AS avg_t
ON date_dtime = DATE(dtime)
WHERE dtime dtime >= '2012-11-15' AND dtime < '2012-12-01'
ORDER BY dtime DESC
于 2012-12-02T09:09:05.590 に答える
0

最初のクエリはすでに非常に効率的であるため、それを出発点として使用しましょう。生成される結果セットのサイズにもよりますが、最初のクエリの結果をクエリすることは依然として非常に効率的です。

3 番目のクエリも非常に効率的に実行されるように見えるため、提案したクエリが十分に機能しない場合は、それにフォールバックできます。私がこれを気に入っている理由は、元のクエリを sorts のパラメーター (マイナスORDER BY) として取得し、元のクエリの日付範囲の平均気温を示す次のクエリにプラグインできるからです。

SELECT
    DATE(dtime) AS day_of_interest,
    AVG(temperature) AS avg_temperature
FROM
    (
        -- Your first query is here, minus the ORDER BY clause
        SELECT 
            dtime,
            temperature 
        FROM 
            temperatures 
        WHERE 
            dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
        -- ORDER BY irrelevant inside subqueries, only slows you down
        -- ORDER BY 
            -- dtime DESC
    ) AS temperatures_of_interest
GROUP BY
    day_of_interest
ORDER BY
    day_of_interest DESC

このクエリが「十分に効率的に」 ™ 実行される場合、これはおそらく他のソリューションよりもコーディングと自動化が容易なソリューションになる可能性があります。

お役に立てれば!

于 2012-12-02T09:24:58.907 に答える