Postgres GROUP BY 查看日期范围

Dar*_*one 5 sql postgresql group-by gaps-and-islands

我有一个表,其中包含“代码”值更改的历史记录。每个月此表都会获取一条新记录,其中包含指定月份的“代码”的新值。

+----------+------------+------------+------+
| Employee | FromDate   |  ToDate    | Code |
+----------+------------+------------+------+
| Employee | 01/07/2016 | 31/07/2016 |    4 |
| Employee | 01/06/2016 | 30/06/2016 |    2 |
| Employee | 01/05/2016 | 31/05/2016 |    2 |
| Employee | 01/04/2016 | 30/04/2016 |    3 |
| Employee | 01/03/2016 | 31/03/2016 |    3 |
| Employee | 01/02/2016 | 29/02/2016 |    4 |
| Employee | 01/01/2016 | 31/01/2016 |    4 |
+----------+------------+------------+------+
Run Code Online (Sandbox Code Playgroud)

我需要按此数据进行分组,以便每次“代码”更改时获取新记录,并获取“起始日期”的最小值和“截止日期”的最大值。数据必须按“FromDate”降序排列。通过我的查询,我得到了这个结果:

+----------+------------+------------+------+
| Employee | FromDate   |  ToDate    | Code |
+----------+------------+------------+------+
| Employee | 01/05/2016 | 30/06/2016 |    2 |
| Employee | 01/03/2016 | 30/04/2016 |    3 |
| Employee | 01/01/2016 | 31/07/2016 |    4 |
+----------+------------+------------+------+
Run Code Online (Sandbox Code Playgroud)

它工作正常,但如果相同的“代码”有多个日期范围(请参阅第一个表中的 4 个代码),则每个代码只有一行。我想用 2 条记录中的 4 个代码得到这个结果,因为它的周期不是连续的,但它被其他代码(3 和 2)打破了:

+----------+------------+------------+------+
| Employee | FromDate   |  ToDate    | Code |
+----------+------------+------------+------+
| Employee | 01/07/2016 | 31/07/2016 |    4 |
| Employee | 01/05/2016 | 30/06/2016 |    2 |
| Employee | 01/03/2016 | 30/04/2016 |    3 |
| Employee | 01/01/2016 | 29/02/2016 |    4 |
+----------+------------+------------+------+
Run Code Online (Sandbox Code Playgroud)

我使用这个查询:

SELECT
    d."Employee",
    MIN (d."FromDate") AS "FromDate",
    MAX (d."ToDate") AS "ToDate",
    d."Code"
FROM
    (
        SELECT
            "Employees"."FromDate",
            "Employees"."ToDate",
            "Employees"."Code",
            "Employees"."Employee"
        FROM
            schema_estelspa."Employees"
        ORDER BY
            "Employees"."FromDate" DESC
    ) d
GROUP BY
    d."Code",
    d."Employee"
ORDER BY
    (MIN(d."FromDate")) DESC
Run Code Online (Sandbox Code Playgroud)

有什么技巧可以得到我想要的结果吗?

日期格式为:dd/MM/yyyy

Bha*_*ara 2

在这里,您需要设置日期范围并将 from_date 作为按列分组的一部分。您还需要自行加入才能实现此结果。我在teradata中准备了以下SQL。请对您的数据库进行必要的更改(coalesc 用作 if null 表达式,您也可以使用 nvl 或 case 语句)

询问:

SELECT E.EMPLOYEE, E.CODE,COALESCE(ET1.FROMdATE,E.FROMDATE)FROM_DATE ,MAX(E.TODATE)TO_D
FROM EMP_TEST E
LEFT OUTER JOIN EMP_TEST ET1
ON E.EMPLOYEE=ET1.EMPLOYEE
AND E.CODE=ET1.CODE
AND E.FromDate=ET1.ToDate+1
GROUP BY 1,2,3
ORDER BY FROM_DATE
Run Code Online (Sandbox Code Playgroud)

输出:

    Employee    Code    FROM_DATE   TO_D
1   Employee    4   1/1/2016    2/29/2016
2   Employee    2   5/1/2016    6/30/2016
3   Employee    4   7/1/2016    7/31/2016
4   Employee    3   3/1/2016    4/30/2016
Run Code Online (Sandbox Code Playgroud)