impala查询以获取下一个日期

wlp8pajw  于 2021-05-31  发布在  Hadoop
关注(0)|答案(2)|浏览(933)

我有两张 Impala table。
第1个表t1(有其他列,但我只对日期和日期类型作为weekday感兴趣):

date       day_type
04/01/2020 Weekday
04/02/2020 Weekday
04/03/2020 Weekday
04/04/2020 Weekend
04/05/2020 Weekend
04/06/2020 Weekday

第二张表t2:

process date       status
A       04/01/2020 finished
A       04/02/2020 finished
A       04/03/2020 finished
A       04/03/2020 run_again

使用impala查询,我必须从第二个表t2中获取最大日期并获取其状态。根据上表04/03是最长日期。如果状态在04/03完成,那么我的查询应该返回从t1开始的下一个可用工作日日期,即04/06/2020。但如果状态是 run_again ,则查询应返回相同的日期。在上表中,04/03 run_again 当我的查询运行时,输出应该是04/03/2020,而不是04/06/2020。请注意,一个日期可以有多个状态。例如,04/03/2020可以有一个状态为“已完成”的行和另一个状态为“再次运行”的行。在这种情况下,应该优先考虑再次运行,查询应该给出04/03/2020作为输出日期
到目前为止,我尝试的是:从第二个表运行子查询,得到最大日期及其状态。我试图在主查询中运行case,并在case语句中将t1作为subselect,但它不起作用。
是否可以通过impala查询来实现这一点?

ttcibm8c

ttcibm8c1#

一种方法是从表t1而不是相关子查询创建cte。比如:

WITH T3 as (
  select t.date date, min(x.date) next_workday
  from T1 t join T1 x
  on t.date < x.date
  where x.day_type = 'Weekday'
  group by t.date
)
select T2.process, T2.date run_date, T2.status,
  case when T2.status = 'finished' then T3.next_workday
  else T3.date
  end next_run_date
from T2 join T3
on T2.date = T3.date
order by T2.process, T2.date;
+---------+------------+-----------+---------------+
| process | run_date   | status    | next_run_date |
+---------+------------+-----------+---------------+
| A       | 2020-04-01 | finished  | 2020-04-02    |
| A       | 2020-04-02 | finished  | 2020-04-03    |
| A       | 2020-04-03 | run again | 2020-04-03    |
+---------+------------+-----------+---------------+

然后可以从结果中选择max而不是排序。

a64a0gku

a64a0gku2#

考虑到性能,可能有多种解决方案,甚至有更好的解决方案,但这是我的方法。希望有帮助。

select case when status='run_again' then t2_date else t1_date end as needed_date from t2 cross join (select t1_date from t1 where t1.day_type='Weekday' and t1_date>(select max(t2_date) from t2) order by t1.t1_date limit 1)a where t2_date=(select max(t2_date) from t2);

相关问题