Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PostgreSQL计数查询优化PHP脚本_Php_Sql_Postgresql - Fatal编程技术网

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

使用PostgreSQL计数查询优化PHP脚本,php,sql,postgresql,Php,Sql,Postgresql,我在一个非常简单的任务中遇到了一些性能问题(执行速度),如下所述。我的代码无法在此处显示,因此我将详细解释该问题: 考虑以下sql表,该表存储了~12年的每日降雨量数据: 历史数据 现在,考虑另一个结构相同的表,但保持1年的每日预测数据: 预测 问题是:对于预测数据的每一天,计算历史数据中相同的(月、日),以便观察到的降雨量>降雨量预测 例子 考虑预测条目 year = 2013, month = 3, day = 15, rainfall_forec = 10 然后,我需要计算每个月=3天=

我在一个非常简单的任务中遇到了一些性能问题(执行速度),如下所述。我的代码无法在此处显示,因此我将详细解释该问题:

考虑以下sql表,该表存储了~12年的每日降雨量数据:

历史数据

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

预测 问题是:对于预测数据的每一天,计算历史数据中相同的(月、日),以便观察到的降雨量>降雨量预测

例子 考虑预测条目

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

您可以尝试以下查询:

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

您需要的输出具体是什么?只是一个365个计数的列表?是的,输出是一个计数数组,包含365个项目。您需要的输出是什么?只是一个365个计数的列表?是的,输出是一个计数数组,包含365个项目。有一些可以帮助您。但是它通常不是默认安装的,所以您需要访问数据库服务器。这可能会对您有所帮助。但它通常不是默认安装的,因此您需要访问数据库服务器。
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