带有 max() 的案例陈述

Case statement with max()

我有一个日期列 yyyy_mm_dd。我想使用以下逻辑基于它创建一个附加列:

  1. if yyyy_mm_dd = 一个月的最后一天然后 1
  2. 如果 yyyy_mm_dd 不是该月的最后一天,而是数据集中的最大日期,则 1
  3. 否则为 0

我想出了这个,它适用于逻辑的第 1 部分和第 3 部分:

select
    *,
    case
        when yyyy_mm_dd == last_day(yyyy_mm_dd) then 1
        when yyyy_mm_dd != last_day(yyyy_mm_dd) then 0
    end as last_day_of_month
from
    my_table
where
    yyyy_mm_dd is not null

这很好用,然后我尝试为最终逻辑添加以下内容:

when (yyyy_mm_dd == last_day(yyyy_mm_dd) or yyyy_mm_dd == max(yyyy_mm_dd)) then 1

然而它错误地说:

Expression not in GROUP BY key id

有什么方法可以实现这个 'last day of month or max date' 标志?我不希望每组 max_date 即 id 而是整个数据集中的绝对最大日期

使用子查询和解析函数计算最大值。 max(yyyy_mm_dd) over() 将 return 数据集中的绝对最大值,不需要分组依据。

select
    t.*, --list columns here
    case
        when (yyyy_mm_dd == last_day(yyyy_mm_dd) or yyyy_mm_dd == max_dt ) then 1
        else 0
    end as last_day_of_month
from
    (select t.*, max(yyyy_mm_dd) over() as max_dt from  my_table t
      where yyyy_mm_dd is not null) t;