PostgreSQL查询包括WITH子查询
发布时间:2020-12-13 18:05:54 所属栏目:百科 来源:网络整理
导读:从下表(命名状态)中,我需要在2015年年底之前提取状态为“01”的城镇代码.列status_date存储城镇更改其状态的日期. gid | town | status | status_date-----+-----------+---------+-------------1 | 86001 | 00 | 2000-01-012 | 86001 | 01 | 2016-03-013 |
从下表(命名状态)中,我需要在2015年年底之前提取状态为“01”的城镇代码.列status_date存储城镇更改其状态的日期.
gid | town | status | status_date -----+-----------+---------+------------- 1 | 86001 | 00 | 2000-01-01 2 | 86001 | 01 | 2016-03-01 3 | 86002 | 01 | 2000-01-01 4 | 86003 | 00 | 2000-01-01 5 | 86003 | 01 | 2015-03-01 6 | 86003 | 02 | 2015-09-01 我可以使用以下有点长的查询来实现这一点: WITH tab AS (SELECT town,MAX(status_date) FROM status GROUP BY town) SELECT t.town FROM tab t LEFT JOIN status s ON t.town = s.town AND t.max = s.status_date WHERE t.max < '2016-01-01' AND s.status = '01' ; 结果是: town ------- 86002 关于如何使这个查询更简单的任何想法? WITH必不可少? 要创建用于测试的表: CREATE TABLE status (gid serial NOT NULL,town CHARACTER VARYING(5),status CHARACTER VARYING(2),status_date DATE) ; INSERT INTO status (town,status,status_date) VALUES ('86001','00','2000-01-01'),('86001','01','2016-03-01'),('86002',('86003','2015-03-01'),'02','2015-09-01') ;
您可以通过以下方式执行此操作:
select s.* from (select distinct on (s.town) s.* from status s where s.status_date < '2016-01-01' order by s.town,s.status_date desc ) s where status = '01'; 此查询将获取截至2015年底的每个城镇的最新状态.外部查询然后选择那些为01的城市. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |