使用PostgreSQL计数查询优化PHP脚本

时间:2013-09-20 04:02:49

标签: php sql postgresql

我有一些性能问题(执行速度)和一个非常简单的任务,如下所述。我的代码是愚蠢的显示在这里,所以我将详细解释这个问题:

考虑以下sql表,它存储大约12年的每日降雨量数据:

历史数据

year, month, day, rainfall_observed
2001, 1, 1, 4
2001, 1, 2, 0
...
2012, 12, 31, 10

现在,考虑另一个具有相同结构的表,但保留约1年的每日预测数据:

预测

year, month, day, rainfall_forec
2013, 1, 1, 0
2013, 1, 2, 3
...
2013, 12, 31, 15

问题:对于每天的预测数据,请计算历史数据中的相同(月,日),以便rain_observed> rainfall_forec。

实施例

考虑预测条目

year = 2013, month = 3, day = 15, rainfall_forec = 10

然后我需要计算历史数据每个条目 month = 3 AND day = 15 WHERE 降雨量> 10 (使用SQL轻松实现)。因此,我的输出是一个列表,其中包含每个预测日的计数。

有很多方法可以做到这一点:

1 - 在for循环中使用SQL查询(每个预测日1个查询=循环中的365个查询 - 我还没有测试它)

2 - 查询所有观察到的数据并使用嵌套循环进行比较(~365 * 12 * 365比较......)

3 - 将上述或某些数学与日期混合(但这里缺少数据是一个问题)

我目前正在使用选项2,但我需要它更快。我会尝试选项1,但也许我错过了一个更简单的解决方案。

所以,我很感激有关如何解决这个问题的任何建议。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的查询:

SELECT r_for.year, r_for.month, r_for.day, count(r_for.rainfall_forec) 
FROM forecast AS r_for 
RIGHT JOIN historic_data AS r_obs 
ON r_for.month = r_obs.month 
  AND r_for.day = r_obs.day 
  AND r_obs.rainfall_observed > r_for.rainfall_forec 
GROUP BY r_for.year, r_for.month, r_for.day