- DOI:
10.13738/j.cnki.acc.qklw60536
- 专辑:
科学Ⅰ辑;信息科技
- 专题:
信息、科学;综合科技
- 分类号:
G90;N92
摘要:本文通过展示SQL语言在典型航空气候志数据统计中的实际例子,力求抛砖引玉,和读者一起共同提高利用SQL语言分析、统计航空气象数据的应用水平,以下的SQL代码均在SQLSERVER2012调试通过。
关键词:SQL语言;航空气候;统计
引言
按照《民用航空气象资料管理办法》的要求,具有五年或者五年以上24小时或者13小时气象观测资料的机场气象台或者机场气象站应当编写《民用机场航空气候志》,并应逐年更新机场气候表,每五年续编一次。民航气象资料统计要求机场气候志或气候概要中的气候统计表不仅仅是静态的数据,而应每年进行滚动更新,因此编写过程中涉及大量数据统计与分析。如何对大量历史资料进行快速、准确统计是决定气候志和气候概要最终产品质量的重要前提。
航空气候志的统计数据来源于观测报文和观测薄纪要栏。目前国内各机场气象部门广泛采用SqlServer、MySQL、Oracle等数据库系统存储报文数据,而SQL(Structured Query Language,结构化查询语言的缩写)是使用最为广泛的数据库语言,灵活使用其语言元素,可进行各种复杂的数据库操作,满足用户的各类查询、统计需求。
一、数据库基本概念
一个数据库通常包含一个或多个表。每个表有一个名字标识,表包含带有数据的记录(行),每一行都有不同数目归属于某类的字段(列)。以笔者所在太原机场为例,气象报文数据存储在SqlServer2012数据库中,数据库内建立了两个表element1和element2。表element1的一条记录有17个字段,分别对应年、月、日、小时和每小时的风向风速、能见度、跑道视程、天气现象、云状云高、温湿度、气压等,代表了小时气象要素数据;表element2的一条记录有9个字段,对应年、月、日和日最高、最低温度、降水量、积雪深度、纪要栏等,代表了日气象数据。
二、SQL语言在《民用机场航空气候志》数据统计中应用
航空气候志中的数据统计主要遵从于民用航空气象第7部分《气候资料整编与分析》要求的“机场气候总表”、“机场气象要素极值表”等26个数据表格。归纳起来,这些统计数据主要有以下三类:
1、 平均值(如年平均风速);
2、 极值(如月最高气温、初雷终雷日);
3、 累计值(如月雷暴次数、年大雾日数、年降水量等)。
因此本文就从这三类数据的统计出发,看看如何科学利用SQL语句,快速高效地从数据库中检索或者统计出所需的气象数据。
1、平均值的统计
SQL语言中的聚合函数是对一组值执行计算并返回单一的值,如AVG( )得到的是平均数。因此SQL语言可以非常简单地求出平均值,如求年平均气温,以下SQL语句将所有时次温度相加除以时次数,得出的结果是11.13摄氏度。
代码 ▼
SELECT AVG(温度) FROM element1 |
但是根据气候志统计要求,年平均气温的计算是要先计算各日平均,再根据各日平均计算各月平均,再根据各月平均计算各年平均,再将各年平均相加除以年份数得出,相应的SQL语句是:
代码 ▼
SELECT avg(年平均) FROM (SELECT avg(月平均) AS 年平均,年 FROM (SELECT avg(日平均) AS 月平均,年,月 FROM (SELECT avg(温度) AS 日平均,年,月,日 FROM element1 GROUP BY 年,月,日) AS b GROUP BY 年,月) AS a GROUP BY 年) AS aa |
此处用到了GROUP BY 语句,GROUP BY根据一个或多个列对结果集进行分组。GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组。以上SQL语句中代码段“(SELECT avg(温度) AS 日平均,年,月,日 FROM element1 GROUP BY 年,月,日) AS b”首先得出各年各月各日平均气温,其次代码段“SELECT avg(日平均) AS 月平均,年,月 FROM b GROUP BY 年,月) AS a”得出各年各月平均气温,而代码段“(SELECT avg(月平均) AS 年平均,年 FROM a (GROUP BY 年) AS aa”得出各年平均气温,最后代码段“SELECT avg(年平均) FROM aa ”得出年平均气温,结果为11.08摄氏度,和AVG(温度)的统计结果有微小的差异。
值得注意的是,用AVG( )适合那些不为空值的记录的统计,如每时次都有的温度、气压等。但是如果想统计平均降水量,由于不是每天都有降水,用AVG( )统计就有问题,此时应该增加判定语句“WHERE降水量 IS NOT NULL”去除没有降水量的记录,即可求出各年各月平均降水量。
代码 ▼
SELECT AVG(降水量) AS 月平均,年,月 FROM element2 WHERE 降水量 IS NOT NULL GROUP BY 年,月 ORDER BY 年,月 |
2、极值的统计
气候志中极值统计一般包括最大值、最小值,如最高气温、最大风速等;也包括天气现象发生的初、终日,如每年发生第一次或最后一次雷暴的时间。
聚合函数中MAX( )、MIN( )可以快速从一组数据中查找最大、最小值。如统计历年最高、最低温度。
代码 ▼
SELECT MAX(温度),MIN(温度) FROM element1 |
其实也可用TOP语句结合排序,间接查询到最大、最小值。以下语句结果效果一样,可以分别求出最高气温和最低气温。
代码 ▼
SELECT TOP 1 温度 FROM element1 ORDER BY 温度 DESC |
SELECT TOP 1 温度 FROM element1 ORDER BY 温度 |
如需要统计累年各月大雾(FG)发生的最多、最少日数。以下SQL语句可实现。代码段“(SELECT DISTINCT 年,月,日 FROM element1 WHERE 天气现象 like '%FG%') AS a”表示将所有发生大雾的日数列出,代码段“(SELECT count(*) as b,月,年 FROM a GROUP BY 年,月) AS c”列出各年各月大雾日数,代码段“SELECT max(b),min(b),月 FROM c GROUP BY 月”查找出各月最多、最少的大雾次数。需要注意的是这里统计出的月最少大雾日数为1,这仅代表发生过大雾的情况,语句“WHERE 天气现象 like '%FG%'”的条件限制将大雾发生为0次的情况排除在外。
代码 ▼
SELECT max(b),min(b),月 FROM (SELECT count(*) as b,月,年 FROM (SELECT DISTINCT 年,月,日 FROM element1 WHERE 天气现象 like '%FG%') AS a GROUP BY 年,月) AS c GROUP BY 月 |
气候志中还需要统计初雷和终雷时间。在此段代码中,语句“ (SELECT 年,MIN(月+日) AS z FROM element2 WHERE 天气演变 like '%TS%' GROUP BY 年) AS t”和“(SELECT 年,MAX(月+日) AS z FROM element2 WHERE 天气演变 like '%TS%' GROUP BY 年) AS t”将各年的初雷终雷日期(即月+日)列出,语句“SELECT min(z),max(z) FROM t”从各年中筛选出最早、最晚的初雷终雷日期。
代码 ▼
SELECT min(z),max(z) FROM (SELECT 年,MIN(月+日) AS z FROM element2 WHERE 天气演变 like '%TS%' GROUP BY 年) AS t |
SELECT min(z),max(z) FROM (SELECT 年,MAX(月+日) AS z FROM element2 WHERE 天气演变 like '%TS%' GROUP BY 年) AS t |
3、次数的统计
气候志中次数的统计一般包括次数、日数、总量和频率的统计。
聚合函数中COUNT(* )、SUM( )可以快速从一组数据中查找符合条件的记录数或者将值相加。如统计累年7月逐时雷暴出现次数:
代码 ▼
SELECT 北京时,count(*) FROM element1 WHERE 天气现象 like '%TS%' and 月 = '07' GROUP BY 北京时 |
统计每月温度大于39的日数:
代码 ▼
SELECT count(*),月 FROM (SELECT DISTINCT 年,月,日 FROM element1 WHERE 温度 > 39) AS a GROUP BY 月 |
统计逐年的总降水量:
代码 ▼
SELECT SUM(降水量),年 FROM element2 GROUP BY 年 ORDER BY 年 |
统计12月风速大于3米每秒的盛行风向和频率,所谓盛行风向就是出现最多的风向。代码段“(SELECT max(cnt) FROM (SELECT count(*) cnt FROM element1 WHERE 风速 >= 3 and 月 = '12' GROUP BY 风向) tmp)”可以求出12月风速大于3米每秒的盛行风向;接下来我们利用“GROUP BY 风向 HAVING count(*)”限定找到盛行风向的聚类,求出此风向的次数,除以代码段“(SELECT count(*) FROM element1 WHERE 风速 >= 3 and 月 = '12')”得到的全部风向的次数,即可得到盛行风向的频率。(此处count(*)*1.0主要是为了确保小数点后数字的显示)
代码 ▼
SELECT 风向,count(*)*1.0/(SELECT count(*) FROM element1 WHERE 风速 >= 3 and 月 = '12') FROM element1 WHERE 风速 >= 3 and 月 = '12' GROUP BY 风向 HAVING count(*) = (SELECT max(cnt) FROM (SELECT count(*) cnt FROM element1 WHERE 风速 >= 3 and 月 = '12' GROUP BY 风向) tmp) |
4、字段的计算
在气候志中,有些需要统计的气象要素不是基本量,没有单独存储,如温度露点差、日较差等,需要多个字段进行计算才能得出。
温度露点差是表征大气湿度的物理量,但是在element1表中只单独存储了温度和露点数据,因此温度露点差需要进行字段间的计算。我们可以通过以下SQL语句来查询能度小于1000米时温度露点差的平均值:
代码 ▼
SELECT AVG(温度-露点) FROM element1 WHERE 能见度 < 1000 |
在气候志中的气候总表中还要计算平均日较差。平均日较差等于日最高平均温度与日最低平均温度的差值。可以通过以下SQL语句得到:
代码 ▼
SELECT AVG(最高温度)-AVG(最低温度),月 FROM element2 GROUP BY 月 ORDER BY 月 |
三、结语
为了确保飞行安全,趋利避害,寻求经济效益,航空气象资料越来越为广大航空气象用户所重视,航空天气预报也越来越重视大数据统计出来的规律和结果,各机场的航空气候志正发挥出越来越大的作用。在机场气候志编写过程中要涉及大量的数据统计和分析,除了规定统计的表格外,各用户对气象资料的使用要求也各种各样,各不相同。SQL语言作为一种利器,能够快速准确的满足用户各方面的查询和统计需求。通过以上几个典型例子的例举,能够看到SQL语言在气象数据“挖掘”中的显著作用,希望此文能够抛砖引玉,和大家一起共同进步,不断提高SQL运用水平,更好地做好航空气象统计数据的应用,为航班飞行的安全、正常和效率提供准确的气象决策信息。
参考文献
[1] 刘敏.民航机场气候志统计与分析系统的设计与实现[J].科技传播, 2019, 11(21):2.DOI:CNKI:SUN:KJCB.0.2019-21-051.
[2] 舒秦.气候志分析统计的设计与实现[J].电脑知识与技术:学术版, 2015(1X):4.DOI:CNKI:SUN:DNZS.0.2015-03-006.
作者简介:管翔(1971.12),男,汉族,江苏,本科,高级工程师,从事气象预报工作。
相关文献推荐
- 节点文献
- 读者推荐
- 相关基金文献
- 关联作者
- 相关视频
- 批量下載
