如何从 Hive 表中获取月份 = 当前月份 else 月份 = 上个月(当前月份 - 1)的记录?
Posted
技术标签:
【中文标题】如何从 Hive 表中获取月份 = 当前月份 else 月份 = 上个月(当前月份 - 1)的记录?【英文标题】:How to fetch the records from Hive table where the month = current month else month = previous month (current month – 1)? 【发布时间】:2019-11-20 08:54:33 【问题描述】:我有一种情况,我需要从 Hive 表中检索数据,其中月份 = 当前月份。如果当前月份的数据不可用,我需要从上个月获取。我们如何在 Hive 查询中实现这种情况。
我的查询正确吗?
Select emp_name, emp_number,
case when emonth IS NULL then concat(year(current_date()),'-' ,month(current_date())-1) else emonth end
FROM db.emptable
where emonth =concat(year(current_date()),'-' ,month(current_date()))
我不确定上述查询,因为如果表 CASE 条件中没有当前月份记录,只需在 emonth 列 中分配上个月。 但是如果月份是当前月份,我需要进行验证,否则获取上个月的数据。
【问题讨论】:
【参考方案1】:month(string date) 可用于从任何日期戳中获取月份。
所以你可以试试:
选择emp_name、emp_number、 当 emonth 为 NULL 然后是 month(add_months(current_date(), -1)) 的情况 其他月份 结尾 FROM db.emptable
【讨论】:
嗨Pawan,你的意思是我们不需要处理where子句?其实不是很清楚。我让它变得简单。我需要获取月份为当前月份的emp数据,如果当前月份没有可用数据,我需要从上个月获取。【参考方案2】:使用 row_number 过滤数据:
select emonth, emp_name, emp_number
from
(
select emonth, emp_name, emp_number,
row_number() over (partition by emp_number order by case when emonth= substr(current_date(),1,7) then 1 else 2 end ) rn
from db.emptable
where emonth >= substr(add_months(concat(substr(current_date(),1,7),'-01'),-1),1,7) --prev month
)s
where rn=1 -- If current month is absent, previous month rn=1
在 row_number 中写入 partition by 子句,因为您需要正确计算它。在我的回答中,将为每个 emp_number 计算 row_number。
【讨论】:
以上是关于如何从 Hive 表中获取月份 = 当前月份 else 月份 = 上个月(当前月份 - 1)的记录?的主要内容,如果未能解决你的问题,请参考以下文章