很难解释我所经历的事情,所以最好把它放在这里并解释一下。
EMPLOYEE_ID | EMPLOYEE_SUPERVISOR_ID | EFFECTIVE_START_DATE | EFFECTIVE_END_DATE
30665 | 61046 | 30/04/2021 | 30/09/2021
30665 | 8009098 | 30/09/2021 | 31/12/2021
30665 | 8009098 | 31/12/2021 | 31/07/2022
30665 | 73280 | 31/07/2022 | 31/08/2022
30665 | 73280 | 31/08/2022 | 30/09/2022
30665 | 73280 | 30/09/2022 | 30/09/2023
30665 | 73280 | 03/10/2023 | 31/10/2023
30665 | 73280 | 31/10/2023 | 01/12/2023
30665 | 79621 | 01/12/2023 | 04/12/2023
30665 | 79621 | 01/12/2023 | 04/12/2023
30665 | 73280 | 04/12/2023 | 15/01/2024
30665 | 73280 | 15/01/2024 | 15/03/2024
30665 | 73280 | 15/03/2024 | 14/05/2024
30665 | 73280 | 14/05/2024 | 15/05/2024
30665 | 73280 | 15/05/2024 | 17/05/2024
这是我在尝试获取所需内容时遇到的查询:
SELECT
EMPLOYEE_ID
,SUPERVISOR_ID
,MIN(EFFECTIVE_START) AS "EFFECTIVE_START"
,MAX(EFFECTIVE_END) AS "EFFECTIVE_END"
FROM
EMP_TABLE
GROUP BY
1,2
ORDER BY
EFFECTIVE_START ASC
这导致了这个,我的问题是 73280 赚取了最小和最大:
EMPLOYEE_ID | SUPERVISOR_ID | EFFECTIVE_START | EFFECTIVE_END |
---|---|---|---|
30665 | 61046 | 2021年4月30日 | 2021年9月30日 |
30665 | 8009098 | 2021年9月30日 | 2022年7月31日 |
30665 | 73280 | 2022年7月31日 | 2023年1月12日 |
30665 | 73280 | 2022年7月31日 | 2024年5月17日 |
30665 | 79621 | 2023年1月12日 | 2023/04/12 |
但我理想的结果是这样的:
EMPLOYEE_ID | SUPERVISOR_ID | EFFECTIVE_START | EFFECTIVE_END |
---|---|---|---|
30665 | 61046 | 2021年4月30日 | 2021年9月30日 |
30665 | 8009098 | 2021年9月30日 | 2022年7月31日 |
30665 | 73280 | 2022年7月31日 | 2023年1月12日 |
30665 | 79621 | 2023年1月12日 | 2023/04/12 |
30665 | 73280 | 2023/04/12 | 2024年5月17日 |
只要同一主管的有效日期范围存在差距或变化,您就需要打破分组:
WITH SupervisorGroups AS (
SELECT
EMPLOYEE_ID,
EMPLOYEE_SUPERVISOR_ID,
EFFECTIVE_START_DATE,
EFFECTIVE_END_DATE,
SUM(CASE
WHEN LAG(EMPLOYEE_SUPERVISOR_ID) OVER (PARTITION BY EMPLOYEE_ID ORDER BY EFFECTIVE_START_DATE) = EMPLOYEE_SUPERVISOR_ID
AND LAG(EFFECTIVE_END_DATE) OVER (PARTITION BY EMPLOYEE_ID ORDER BY EFFECTIVE_START_DATE) = EFFECTIVE_START_DATE
THEN 0
ELSE 1
END) OVER (PARTITION BY EMPLOYEE_ID ORDER BY EFFECTIVE_START_DATE) AS GroupFlag
FROM EMP_TABLE
)
SELECT
EMPLOYEE_ID,
EMPLOYEE_SUPERVISOR_ID AS SUPERVISOR_ID,
MIN(EFFECTIVE_START_DATE) AS EFFECTIVE_START,
MAX(EFFECTIVE_END_DATE) AS EFFECTIVE_END
FROM SupervisorGroups
GROUP BY EMPLOYEE_ID, EMPLOYEE_SUPERVISOR_ID, GroupFlag
ORDER BY EFFECTIVE_START ASC;