【问题标题】:ADD date missing in request添加请求中缺少的日期
【发布时间】:2020-05-07 09:17:53
【问题描述】:

例如,我想在请求中列出两个日期之间缺少的日期

我的数据:

表格顺序

DATE_order  | AMOUNT    
01/01/2020  |  500    
01/01/2020  |  600    
03/01/2020  |  100    
05/01/2020  |  300

我希望请求返回

01/01/2020   | 1100    
02/01/2020   | 0    
03/01/2020   | 100    
04/01/2020   | 0    
05/01/2020   | 300

我使用带有 Apach Hive 连接器的 Cassandra 数据库

有人可以帮助我吗?

【问题讨论】:

  • 您需要在递归 CTE 中生成从最小到最大的日期列表,没有间隙。但是 HiveQL 不支持这一点(Apache Hive / ... / Common Table Expression - 不支持递归查询)。
  • 因此不能使用 hive?
  • 我不会这么说。我只是告诉你,这种任务解决的常用方法是不可用的——但也许存在一些我不知道的特定方法或技巧。一些值生成器,迭代的用户定义函数,其他的......
  • 谢谢,我会朝这个方向看
  • 请查看我的回答

标签: sql hive cassandra hiveql spring-data-cassandra


【解决方案1】:

您可以使用横向视图和poseexplode 生成缺失的行:

with your_data as (
select stack(4,
'2020-01-01',500,    
'2020-01-01',600,   
'2020-01-03',100,    
'2020-01-05',300
) as (DATE_order,AMOUNT )
)

select date_sub(s.date_order ,nvl(d.i,0)) as date_order, case when d.i > 0 then 0 else s.amount end as amount
from
(--find previous date
select date_order, amount, 
        lag(date_order) over(order by date_order) prev_date,
        datediff(date_order,lag(date_order) over(order by date_order)) datdiff
from
( --aggregate
 select date_order, sum(amount) amount from your_data group by date_order )s
)s
--generate rows
lateral view outer posexplode(split(space(s.datdiff-1),' ')) d as i,x
order by date_order;

结果:

date_order      amount
2020-01-01      1100
2020-01-02      0
2020-01-03      100
2020-01-04      0
2020-01-05      300
Time taken: 10.04 seconds, Fetched: 5 row(s)

【讨论】:

  • 它可以工作,但我的某个地方缺少 group by。我有重复的日期,我会尝试更正我让你快速发布
  • @broly21 一步一步调试。我希望您大致了解如何使用分解+横向视图生成行。如果您有更多键,则可能应该在计算 LAG 时将它们添加到 partition by 子句中:lag(date_order) over(PARTITION BY BLA, BLA order by date_order)
  • 谢谢,我更正了,只是我忘记在分组中转换日期(日期顺序),一切正常,谢谢,但是您在哪里管理日期间隔?
  • @broly21 计算日期差异:datediff(date_order,lag(date_order) over(order by date_order)) datdiff 然后 space(datdiff) - 生成长度=天数差异的空格字符串。然后 split - 生成数组。然后posexplode生成行i是数组中的一个位置(天差)它从当前行日期中减去以获得缺失日期
  • 好的,谢谢,我明白了,2019年12月的格式YYYYMM示例201912的情况相同,很难重复使用此请求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多