通过 groupby 解决重复值的最佳方法

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

很难解释我所经历的事情,所以最好把它放在这里并解释一下。

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日
sql snowflake-cloud-data-platform
1个回答
0
投票

只要同一主管的有效日期范围存在差距或变化,您就需要打破分组:

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;
© www.soinside.com 2019 - 2024. All rights reserved.