使用Hive SQL获取每月最大日期结果异常,求正确实现方案
修正Hive SQL以获取每个日期所在月份的最大日期
你的问题出在分区键的选择上:last_day(yyyymmdd)无法正确按月份分区,导致窗口函数计算的是全表的最大日期而非当月最大。
修正后的代码方案
方案1:按年+月分区
SELECT yyyymmdd, MAX(yyyymmdd) OVER (PARTITION BY year(yyyymmdd), month(yyyymmdd)) AS last_yyyymmdd FROM mytable t
方案2:按格式化后的年月字符串分区
SELECT yyyymmdd, MAX(yyyymmdd) OVER (PARTITION BY date_format(yyyymmdd, 'yyyy-MM')) AS last_yyyymmdd FROM mytable t
问题原因说明
原代码中,若yyyymmdd是字符串类型,Hive的last_day函数可能无法正确将其解析为日期类型,导致所有行的分区键值异常统一,窗口函数失去分区作用,最终计算出全表的最大日期2020-06-23。
而通过year()+month()或date_format()提取年月维度作为分区键,能确保同一月份的所有行被归为同一分区,从而正确计算出每个月的最大日期。
若你的
yyyymmdd是yyyymmdd数字格式(如20200501),需先转换为日期类型再处理:SELECT yyyymmdd, MAX(to_date(yyyymmdd, 'yyyyMMdd')) OVER (PARTITION BY date_format(to_date(yyyymmdd, 'yyyyMMdd'), 'yyyy-MM')) AS last_yyyymmdd FROM mytable t
内容的提问来源于stack exchange,提问作者Rosana Guimarães Ribeiro
相关产品推荐
相关产品推荐

