我在一个非常简单的任务中遇到了一些性能问题(执行速度),如下所述。我的代码在这里显示是愚蠢的,所以我将详细解释这个问题:
考虑以下 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
问题:对于每天的预测数据,在历史数据中计算相同的(月,日),这样rainfall_observed> rainfall_forec。
例
考虑预测条目
year = 2013, month = 3, day = 15, rainfall_forec = 10
然后我需要计算每个条目的历史数据,其中月份 = 3 且天 = 15,其中观察到的降雨量> 10(使用 SQL 很容易)。因此,我的输出是一个列表,其中包含每个预测日的计数。
有很多方法可以做到这一点:
1 - 使用 for 循环内部的 SQL 查询(每个预测日 1 个查询 = 循环中的 365 个查询 - 我还没有测试它)
2 - 查询所有观察到的数据并使用嵌套循环进行比较(~ 365 * 12 * 365 比较...
3 - 对上述内容进行一些混合或与日期进行一些数学运算(但这里缺少数据是一个问题)
我目前正在使用选项 2,但我需要它更快。我将尝试选项 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