与 GROUP BY 结合使用的情况

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

我的数据如下。

人员ID 属性ID 开始日期 结束日期 Verhouding
16525 4 2023-01-01 2023-02-01 32
16573 5 2023-04-01 2023-03-01 78
16500 1 2023-01-01 2023-07-01 34
16500 1 2023-01-01 2023-05-01 0
16356 1 2023-01-01 2023-05-01 0

我想标记每个具有非零“Verhouding”的字段。这可以通过使用

CASE WHEN
轻松完成,如下所示:

SELECT table.*,
CASE WHEN Verhouding != 0 THEN 1 ELSE 0
END AS verhouding_flag
FROM table

预期结果如下:

人员ID 属性ID 开始日期 结束日期 Verhouding verhouding_flag
16525 4 2023-01-01 2023-05-01 32 1
16573 5 2023-04-01 2023-05-01 78 1
16500 1 2022-05-01 2023-05-01 34 1
16500 1 2023-05-01 2023-05-01 0 0
16356 1 2023-01-01 2023-05-01 0 0

但是,在某些特殊情况下,有一个 Person 的 Verhouding 为 0 AND 的 Verhouding 不为零。在我的示例中,PersonID 16500 就是这种情况。在这种情况下,当 Verhouding 为 0 时,我还希望 verhouding_flag 为 1。所以预期结果是这样的:

人员ID 人员ID 开始日期 结束日期 Verhouding verhouding_flag
16525 4 2023-01-01 2023-05-01 32 1
16573 5 2023-04-01 2023-05-01 78 1
16500 1 2022-05-01 2023-05-01 34 1
16500 1 2023-05-01 2023-05-01 0 1
16356 1 2023-01-01 2023-05-01 0 0

我可以通过例如对 PersoonID、AttributeID 和 StartDate 进行分组来找到这些特殊情况,并查看哪些组的大小大于 1(这意味着它们在“Verhouding”列中有多个条目)。

但是,我不知道如何将这样的解决方案与 CASE WHEN 结合起来?任何帮助将不胜感激。

sql group-by case
1个回答
0
投票

您可以在这里使用

max()
窗口功能:

select t.*,
  Max(case when Verhouding != 0 then 1 else 0 end) over(partition by PersoonID) verhouding_flag
from t;
© www.soinside.com 2019 - 2024. All rights reserved.