我有一个日期列yyyy_mm_dd。我想使用以下逻辑基于它创建一个附加列:
- 如果 yyyy_mm_dd = 一个月的最后一天,则 1
- 如果 yyyy_mm_dd 不是该月的最后一天而是数据集中的最大日期,则为 1
- 否则为 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
有什么办法可以实现这个“月份的最后一天或最大日期”标志?我不想要每组的 max_date,而是整个数据集中的最大日期
不说废话,上方法:
使用子查询和解析函数计算最大值。max(yyyy_mm_dd) over()将返回数据集中的最大值并且不需要分组依据。
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;