Sql 从postgres中的同一组中选择最早和最近的日期

Sql 从postgres中的同一组中选择最早和最近的日期,sql,postgresql,date,Sql,Postgresql,Date,我想使用postgresql从同一组区域的其他人那里获得一个最早和最近的日期。 我汇总后得到了下表,但下一步就失败了 SELECT string_agg(id, ';') AS ids, region, STRING_AGG(to_char(date1, 'YYYY-MM-DD'),';') AS dates FROM table1 GROUP BY region +---------+--------+-------------------------------------------

我想使用postgresql从同一组区域的其他人那里获得一个最早和最近的日期。

我汇总后得到了下表,但下一步就失败了

SELECT string_agg(id, ';') AS ids, region, 
STRING_AGG(to_char(date1, 'YYYY-MM-DD'),';') AS dates
FROM table1
GROUP BY region

+---------+--------+---------------------------------------------+
|   ids   | region |                    dates                    |
+---------+--------+---------------------------------------------+
| 1;2;3;4 | a      | 2017-01-01;2017-01-07;2017-03-03;2017-04-03 |
| 5;6     | b      | 2017-02-02;2017-02-28                       |
+---------+--------+---------------------------------------------+
在这里,我不确定如何构造下表

+----+--------+------------+----------------+
| id | region |   date1    | neareast_early |
+----+--------+------------+----------------+
|  1 | a      | 2017-01-01 |                |
|  2 | a      | 2017-01-07 | 2017-01-01     |
|  3 | a      | 2017-03-03 | 2017-01-07     |
|  4 | a      | 2017-04-03 | 2017-03-03     |
|  5 | b      | 2017-02-02 |                |
|  6 | b      | 2017-02-28 | 2017-02-02     |
+----+--------+------------+----------------+

您可以这样做:

SELECT a.*, IFNULL((SELECT b.date1 FROM table1 b WHERE b.date1 < a.date1 AND a.region = b.region ORDER BY b.date1 DESC LIMIT 1), "") AS neareast_early FROM table1 a;
工作

使用滞后


请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关的反馈意见。请阅读:stackoverflow.com/help/someone-answers了解它的重要性。
SELECT a.*, IFNULL((SELECT b.date1 FROM table1 b WHERE b.date1 < a.date1 AND a.region = b.region ORDER BY b.date1 DESC LIMIT 1), "") AS neareast_early FROM table1 a;
SELECT id
    ,region
    ,date1
    ,LAG(date1) OVER (
        PARTITION BY REGION ORDER BY ID
        ) AS neareast_early
FROM table1;