微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL查询包括WITH子查询

从下表(命名状态)中,我需要在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的城市.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐