提问人:Psychotechnopath 提问时间:10/20/2023 更新时间:10/20/2023 访问量:40
CASE 与 GROUP BY 结合使用
CASE WHEN in combination with a GROUP BY
问:
我有如下数据。
PersoonID | 属性 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,并且 Verhouding 不是 0。在我的示例中,PersonID 16500 就是这种情况。在这种情况下,当 Verhouding 为 0 时,我还希望verhouding_flag为 1。所以预期的结果是这样的:
PersoonID | PersoonID | 开始日期 | 结束日期 | 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 相结合?任何帮助将不胜感激。
答:
3赞
Stu
10/20/2023
#1
您可以在此处使用窗口功能:max()
select t.*,
Max(case when Verhouding != 0 then 1 else 0 end) over(partition by PersoonID) verhouding_flag
from t;
1赞
Tomas Greif
10/20/2023
#2
在 postgresql 和许多其他 sql 引擎中,您可以使用如下所示的窗口函数:
SELECT
table.*,
CASE WHEN max(Verhouding) over(partition by PersonID) != 0
THEN 1 ELSE 0 END AS verhouding_flag
FROM
table
有关窗口函数,请参阅文档。
您还可以将结果联接到聚合表,如下所示:
select
t.*,
case when u.mx_Verhouding <> 0 then 1 else 0 end as verhouding_flag
from
table t
join (select PersonID, max(Verhouding) mx_Verhouding from table group by PersonId) u
on t.PersonID = u.PersonID
在此方案中,该语句对名为 的聚合子选择中的每个 maximum of 使用。case
Verhounding
PersonID
u
评论
CASE WHEN MAX(verhouding_flag) OVER (PARTITION BY PersoonID = 0) THEN 0 ELSE 1
GROUP BY