如何在 SQL 中获取分支代码更改后的最小和最大日期

问题描述 投票:0回答:1

我有如下表格。我正在使用 plsql

身份证 分行代码 开始日期 完成日期
1111 89 2012年6月7日 2013年8月12日
1111 89 2013年8月13日 2015年3月9日
1111 1167 2015年3月10日 2015年9月30日
1111 548 2015年10月1日 2015年10月8日
1111 548 2015年12月9日 2016年7月31日
1111 548 2016年8月1日 2017年8月24日
1111 89 2017年8月25日 2018年3月19日
1111 89 2018年3月20日 2019年6月30日
1111 89 2019年7月1日 今天

我想找到每个分支更改的最小和最大日期。我根据branch_code和emp_ID进行分区,但我不能得到我想要的。

这就是我想要的;

身份证 分行代码 最小开始日期 最大完成日期
1111 89 2012年6月7日 2015年3月9日
1111 1167 2015年3月10日 2015年9月30日
1111 548 2015年10月1日 2017年8月24日
1111 89 2015年8月25日 今天

我想找到分支更改时的最小和最大日期。并计算最小日期和最大日期之间的时间。 T

date max min stage
1个回答
0
投票

这是一个间隙和孤岛问题,我们可以在这里使用行数差异法。

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY ID
                                   ORDER BY StartDate) rn1,
                ROW_NUMBER() OVER (PARTITION BY ID, BranchCode
                                   ORDER BY StartDate) rn2
    FROM yourTable t
)

SELECT
    ID,
    BranchCode,
    MIN(StartDate) AS MinStartDate,
    MAX(FinishDate) AS MaxFinishDate
FROM cte
GROUP BY
    ID,
    BranchCode,
    rn1 - rn2
ORDER BY
    ID,
    MIN(StartDate);

这里的基本思想是形成一个由

ID
BranchCode
和行号序列差异定义的伪组列。 然后,我们需要聚合并取适当的最小值/最大值。

© www.soinside.com 2019 - 2024. All rights reserved.