MySQL查询风玫瑰数据

时间:2014-12-18 02:14:29

标签: mysql weather

我目前有一个名为观察的表格,每分钟更新一次,包括以下字段(其中包括);

time                  wind_speed_kn     wind_dir_deg
2014-12-13 13:34:22   12.3              23
2014-12-13 13:35:17   9.5               55
2014-12-13 13:36:32   12.7              288
...

我有一个执行以下查询的php循环

set time_zone = "+9:30";
select speed_range, count(*) as count from 
(SELECT CASE 
  WHEN max_gust_kn < 0.1 THEN '0' 
  WHEN max_gust_kn > 0.1 and max_gust_kn <= 5 THEN '0-5' 
  WHEN max_gust_kn > 10 and max_gust_kn <= 15 THEN '10-15' 
  WHEN max_gust_kn > 15 and max_gust_kn <= 20 THEN '15-20' 
  WHEN max_gust_kn > 20 THEN '>20' 
END as speed_range from observations 
where (wind_dir_deg > 303.75 and wind_dir_deg < 326.25) and date(time) = date(now()))
as wind_summaries group by speed_range

每次通过php循环时,度数的测试都会改变,所以我得到罗盘上每个点的结果(N,NNE,NE,ENE等)

这大部分工作正常..除了我有时会得到一些NULL结果,这会破坏我的索引。例如,如果我现在为其中一个罗盘点运行它,我会得到以下结果;

speed_range     count
NULL            6
0               445
0-5             58

当我渲染windrose时,我将每个方向的第一个索引计为“平静”或“0”,但是这个空值正在混淆它以及以下索引......

知道查询有什么问题以及我如何摆脱这些NULL值?我不太了解sql并且只是从这里复制了一些示例以使查询正常工作...

如果你想看看我想要达到的目标,可以在http://weather.stormpilgrim.com/windrose.php看到windrose的最终结果。我认为除了这个查询之外一切都很好。

1 个答案:

答案 0 :(得分:1)

NULL值会由case语句中的值引起。这是带有case语句的子查询:

SELECT (CASE WHEN max_gust_kn < 0.1 THEN '0' 
             WHEN max_gust_kn > 0.1 and max_gust_kn <= 5 THEN '0-5' 
             WHEN max_gust_kn > 10 and max_gust_kn <= 15 THEN '10-15' 
             WHEN max_gust_kn > 15 and max_gust_kn <= 20 THEN '15-20' 
             WHEN max_gust_kn > 20 THEN '>20' 
       END) as speed_range
from observations 
where (wind_dir_deg > 303.75 and wind_dir_deg < 326.25) and date(time) = date(now())

问题必定是max_gust_kn可以是NULL。您可以将其包含为有效值:

SELECT (CASE WHEN max_gust_kn < 0.1 THEN '0' 
             WHEN max_gust_kn > 0.1 and max_gust_kn <= 5 THEN '0-5' 
             WHEN max_gust_kn > 10 and max_gust_kn <= 15 THEN '10-15' 
             WHEN max_gust_kn > 15 and max_gust_kn <= 20 THEN '15-20' 
             WHEN max_gust_kn > 20 THEN '>20' 
             ELSE 'Missing'
       END) as speed_range

或者更改where以排除这种可能性:

where (wind_dir_deg > 303.75 and wind_dir_deg < 326.25) and
      max_gust_kn >= 0 and
      date(time) = date(now())