【问题标题】:Case statement with max()带有 max() 的 case 语句
【发布时间】:2021-10-10 15:09:02
【问题描述】:

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

  1. 如果 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

但是它错误地说:

表达式不在 GROUP BY 键 ID 中

有什么方法可以实现这个“一个月的最后一天或最大日期”标志?我不想要每组的 max_date,即id,而是整个数据集中的绝对最大日期

【问题讨论】:

    标签: sql group-by hive case hiveql


    【解决方案1】:

    使用子查询和解析函数计算最大值。 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;
    

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      相关资源
      最近更新 更多