1

我已将温度存储在 MySQL 数据库中。该表称为temperatures。例如,它包含列dtimetemperature。第一个是测量温度的时间(列类型是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

由于您的第一个查询已经非常有效,让我们以它为起点。根据它生成的结果集的大小,查询第一个查询的结果仍然非常有效。

您的第三个查询似乎也非常有效地运行,因此如果我提出的查询执行得不够好,您可以退回到该查询。我喜欢它的原因是因为您可以将原始查询作为排序参数(减去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 回答