我有如下表格。我正在使用 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
这是一个间隙和孤岛问题,我们可以在这里使用行数差异法。
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
和行号序列差异定义的伪组列。 然后,我们需要聚合并取适当的最小值/最大值。