我对复杂的 SQL 请求很陌生...
我想要实现的是在传单地图页面上显示活动天气警报的地图。
首先使用来自国家气象机构的 RSS 提要填充 Postgis 表,然后通过选择过期日期晚于实际日期的 ROW 并通过 Geoserver WFS 服务发布此视图来创建视图。
看起来不错,只是每个地理区域都添加了多个事件有效过期功能,从而导致了一种仅显示顶部事件的多层。
我遇到的问题是,对于每个区域/多边形,我都有多条线用于我必须整理的杂项事件/日期。
初始表的结构如下:
areadesc(county)|event(type of alert)|effective(date)|expires(date)|severity(low,medium,severe)
我试图解决这个烂摊子的方法是:首先为每个事件创建一个视图,以便每个位置只有“此类事件”的最新过期警报:
SELECT DISTINCT ON (country.areadesc)
country.areadesc,
country.event,
country.effective,
country.expires,
country.severity
FROM
country
WHERE
country.expires >= now() AND now() >= country.effective
AND country.event::text = 'Thunderstorms'::text
ORDER BY
country.areadesc, country.expires;
我对每个我感兴趣的事件都这样做了。
其次,我为每个区域创建了一个聚合视图,其中包含相关事件类型的内容:
SELECT DISTINCT
country.areadesc,
country_thunderstorms.severity AS thunderstorms_severity,
country_thunderstorms.effective AS thunderstorms_effective,
country_rain.effective AS rain_effective,
country_rain.expires AS rain_expires,
country_districts.geom
FROM
country_alerts
LEFT JOIN
country_thunderstorms ON country.areadesc::text = country_thunderstorms.areadesc::text
LEFT JOIN
country_wind ON country.areadesc::text = country_wind.areadesc::text
LEFT JOIN
country_rain ON country.areadesc::text = country_rain.areadesc::text
LEFT JOIN
country_districts ON country.areadesc::text = country_districts.name_en::text
WHERE
country.expires >= now() AND now() >= country.effective
AND (country.title::text = ANY (ARRAY['Thunderstorms'::character varying, 'Wind'::character varying, 'Rain'::character varying]::text[]))
ORDER BY
country.areadesc;
所有这些东西都可以完成这项工作,但看起来更像是一把锤子来杀死一只苍蝇。
我确信有一种方法可以通过嵌套 SELECT 在一次运行中实现这一点,但绝对无法弄清楚如何:-(
欢迎任何建议,感谢您的帮助。