从下表(命名状态)中,我需要在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';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。