Sql 连接计算日期之间值的表

Sql 连接计算日期之间值的表,sql,impala,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中

我有下面两张表

表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

我知道应该由join完成,但我不确定在这种情况下您如何加入。
谢谢

Hmmm。在标准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;

这在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))
最后一个不存在。。。需要在表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)

如果你正在考虑在那个范围内的日期,为什么结果集没有你考虑的所有日期?因为1-16和2-20之间的每个日期将被视为周期1,并且周期1将使用1-16来确定它内的值,即1-17。问题陈述中还有一个输入错误,我已经解决了。基本上,两个表的最后日期是相同的,在这种情况下,我们不需要notexists子句right?condition1和condition2这意味着这两个条件都必须为true。所以这里它意味着b.date需要>=从A开始的日期,并且小于表ASo中的下一个日期。对于修订版,上一个日期对于两个表都相同,我们只需要和b.date<从表A中选择MINc.date,其中c.date>A.date对吗?不,您仍然需要我的回答中完整的where子句OK。只是在impala中尝试了它并返回了错误:不支持或谓词中的子查询。知道这是怎么回事吗?
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)