CASE 与 GROUP BY 结合使用

CASE WHEN in combination with a GROUP BY

提问人:Psychotechnopath 提问时间:10/20/2023 更新时间:10/20/2023 访问量:40

问:

我有如下数据。

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 相结合?任何帮助将不胜感激。

SQL Group-By 案例

评论

1赞 JNevill 10/20/2023
取决于您的 RDBMS 是否支持窗口函数:不需要CASE WHEN MAX(verhouding_flag) OVER (PARTITION BY PersoonID = 0) THEN 0 ELSE 1GROUP BY
0赞 Isolated 10/20/2023
同意以上...但只需在 PersoonID 之后将关闭的 paren 向左移动即可。

答:

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 使用。caseVerhoundingPersonIDu