我的数据如下。
人员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 结合起来?任何帮助将不胜感激。
您可以在这里使用
max()
窗口功能:
select t.*,
Max(case when Verhouding != 0 then 1 else 0 end) over(partition by PersoonID) verhouding_flag
from t;