问题描述
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-01
到 2020-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);