带有 max() 的案例陈述
Case statement with max()
我有一个日期列 yyyy_mm_dd
。我想使用以下逻辑基于它创建一个附加列:
- if 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
有什么方法可以实现这个 '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;
我有一个日期列 yyyy_mm_dd
。我想使用以下逻辑基于它创建一个附加列:
- if 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
有什么方法可以实现这个 '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;