Impala 查询下一个日期
Impala Query to get next date
我有 2 个 Impala table。
1st table T1(还有其他列,但我只对工作日的日期和日期类型感兴趣):
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
第 2 table 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 查询,我必须从第二个 table T2 获取最大日期并获取其状态。根据上面的 table 04/03 是最大日期。
如果状态在 04/03 结束,那么我的查询应该 return 从 T1 开始的下一个可用工作日日期,即 04/06/2020。
但是如果状态是 run_again
,那么查询应该是 return 相同的日期。
在上面的 table 中,04/03 有 run_again
,当我的查询 运行 时,输出应该是 04/03/2020 而不是 04/06/2020。
请注意,一个日期可能有多个状态。例如,04/03/2020 可以有一行状态为已完成,另一行状态为 运行。在这种情况下,运行 应该再次被优先考虑,查询应该给出 04/03/2020 作为输出日期
到目前为止我尝试了什么:
我 运行 来自第二个 table 的子查询并获得了最大日期及其状态。我试图 运行 我的主查询中的一个案例,并在 Case 语句中将 T1 作为子选择,但它不起作用。
是否可以通过Impala查询来实现?
一种方法是从 table 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 |
+---------+------------+-----------+---------------+
然后您可以 select 从结果中取最大值而不是排序。
可能有多种解决方案,甚至有一些考虑到性能的更好的解决方案,但这是我的方法。希望对你有帮助。
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);
我有 2 个 Impala table。
1st table T1(还有其他列,但我只对工作日的日期和日期类型感兴趣):
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
第 2 table 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 查询,我必须从第二个 table T2 获取最大日期并获取其状态。根据上面的 table 04/03 是最大日期。
如果状态在 04/03 结束,那么我的查询应该 return 从 T1 开始的下一个可用工作日日期,即 04/06/2020。
但是如果状态是 run_again
,那么查询应该是 return 相同的日期。
在上面的 table 中,04/03 有 run_again
,当我的查询 运行 时,输出应该是 04/03/2020 而不是 04/06/2020。
请注意,一个日期可能有多个状态。例如,04/03/2020 可以有一行状态为已完成,另一行状态为 运行。在这种情况下,运行 应该再次被优先考虑,查询应该给出 04/03/2020 作为输出日期
到目前为止我尝试了什么: 我 运行 来自第二个 table 的子查询并获得了最大日期及其状态。我试图 运行 我的主查询中的一个案例,并在 Case 语句中将 T1 作为子选择,但它不起作用。
是否可以通过Impala查询来实现?
一种方法是从 table 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 |
+---------+------------+-----------+---------------+
然后您可以 select 从结果中取最大值而不是排序。
可能有多种解决方案,甚至有一些考虑到性能的更好的解决方案,但这是我的方法。希望对你有帮助。
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);