如何从 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)的记录?的主要内容,如果未能解决你的问题,请参考以下文章

hive 英文月份转数字

用HIVESQL怎么获取上一个月的月份

获取当月记录[重复]

如何通过'java.sql.date'获取当前系统月份?

如何根据日期列中的月份从 SQLite 中获取数据

SQL查询以获取从当前月份开始的月份列表