加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的城市.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读