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

标签 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

问题:对于每一天的预报数据,统计历史数据中相同的(月,日),使得rainfall_observed > rainfall_forec。

例子

考虑预测条目

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

然后我需要在历史数据中计算month = 3 AND day = 15 WHERE rainfall observed > 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

关于php - 使用 PostgreSQL 计数查询优化 PHP 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908609/

相关文章:

php - Laravel Elfinder 在使用 'auth' 中间件时重定向到主页

sql - BigQuery重复的栏名称

php - SQL 的扩展占位符,例如ID 在哪里(??)

php - 你如何转义命名空间字符串

php - 如何检索类别名称?

sql - 过滤全名 postgresql

django - 在 Django 中显示 Heroku 数据库信息

sql - 使用 PostgreSQL 中的一组值分组

php - 如何设计MySQL数据库

c# - SqlCommand结果-无法将对象从dbnull强制转换为其他类型