连接计算日期之间值的表

时间:2018-04-21 16:01:01

标签: sql impala

所以我有以下两个表

表A

Date        num
01-16-15    10
02-20-15    12
03-20-15    13

表B

Date        Value
01-02-15    100
01-03-15    101
   .         .
01-17-15    102
01-18-15    103
   .         .
02-22-15    104
   .         .
03-20-15    110

我想创建一个在impala中具有以下输出的表

Date         Value
01-17-15     102*10
01-18-15     103*10
02-22-15     104*12
   .           .
   .           .

所以我们的想法是我们只考虑01-16-15和02-20-15之间的日期,以及02-20-15和03-20-15之间的日期。并使用该期间开始日期的数字,例如01-16-15,并将其乘以该期间的每日,即1-16至2-20。

我知道应该通过加入来完成,但我不确定你是如何加入这种情况的。 谢谢!

2 个答案:

答案 0 :(得分:1)

嗯。在标准SQL中,您可以执行以下操作:

select b.*,
       (select a.num
        from a
        where a.date <= b.date
        order by a.date desc
        fetch first 1 row only
       ) * value as new_value
from b;

我不认为这符合范围条件,但我不理解你对此的描述。

我也不知道Impala是否支持相关子查询。复杂数据的替代方案可能更快:

with ab as (
      select a.date, a.value as a_value, null as b_value, 'a' as which
      from a
      union all
      select b.date, null as a_value, b_value, 'b' as which
      from b
     )
select date, b_value * a_real_value
from (select ab.*,
             max(a_value) over (partition by a_date) as a_real_value
      from (select ab.*,
                   max(a.date) over (order by date, which) as a_date
            from ab
           ) ab
     ) ab
where which = 'b';

答案 1 :(得分:1)

这适用于MariaDb(MySql),它非常基本,所以希望它也适用于黑斑羚。

SELECT b.date, b.value * a.num
FROM tableB b, tableA a
WHERE b.date >= a.date
  AND (b.date < (SELECT MIN(c.date) FROM tableA c WHERE c.date > a.date)
       OR NOT EXISTS(SELECT c.date FROM tableA c WHERE c.date > a.date))

最后的NOT EXISTS ...需要包括表A中最后一个日期之后的日期

<强>更新 在问题的修订版本中,B中的日期永远不会超过A中的最后一个日期,因此查询可以写为

SELECT b.date, b.value * a.num
FROM tableB b, tableA a
WHERE b.date >= a.date
  AND b.date <= (SELECT MIN(c.date) FROM tableA c WHERE c.date > a.date)