Hive - 季度中的最大而不是最后一个日期

问题描述

我正在查询一个表,只想选择季度结束日期,我是这样做的:

select
    yyyy_mm_dd,id
from
    t1
where
    yyyy_mm_dd = cast(date_add(trunc(add_months(yyyy_mm_dd,3-pmod(month(yyyy_mm_dd)-1,3)),'MM'),-1) as date) --last day of q

对于每天的行,从 2020-01-012020-12-31,上述工作正常。但是,由于该季度不完整,因此最终省略了 2021 行。如何修改 where 子句,以便我选择每个季度的最后一天当前季度的最大日期?

解决方法

您可以按日期降序为每个季度分配一个行号,并过滤行号等于1的行(每个季度的最后一个日期):

select yyyy_mm_dd,id
from
(select
    yyyy_mm_dd,id,row_number() over (partition by id,year(yyyy_mm_dd),quarter(yyyy_mm_dd) order by yyyy_mm_dd desc) as rn
from
    t1
) t2
where rn = 1
,

不清楚季度末日期是否有多行。取最大值并使用它可能更安全:

select t1.*
from (select t1.*,max(yyyy_mm_dd) over (partition by id,quarter(yyyy_mm_dd)) as max_yyyy_mm_dd
      from t1
     ) t1
where yyyy_mm_dd = max_yyyy_mm_dd;

请注意,这里使用 t1.* 作为选择。如果你只想要最大日期,你可以聚合:

select id,max(yyyy_mm_dd)
from t1
group by id,quarter(yyyy_mm_dd);