修改左连接子句

Modify left join clause

我正在尝试编写一个 impala 查询,该查询使用下面提供的两个表执行以下操作:

Table一个

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

Table B 仅包含 02-20 和 03-20 之间的每天,即

Date     val
02-21    100
02-22    101
02-23    102
  .       .
  .       .
03-19    110

现在我们想每天计算 02-20 和 03-20 之间的总值,只使用日期 02-20(该期间的开始日期)的 A.num。所以比如02-21的总值为100*12,02-22为101*12,03-19为110*12.

我已经写了查询

SELECT A.Date,A.num*B.val AS total FROM TableA A LEFT JOIN Tableb B ON B.Date >= A.Date GROUP BY A.Date,A.num,B.val

但是 return 每天给我两个条目。例如,在 02-20 上,它将 return 101*12101*10,但我只想要 101*12。我注意到这是由 B.Date >= A.Date 上的连接引起的,其中 02-21 确实大于 01-16,因此它同时采用 num 在 01-16 和 02-20 处的值来计算总价值。

任何人都知道我应该如何修改这个连接子句以便它只使用 02-20 上的数字而不是 02-20 和 01-16?

编辑

示例输出

Date     total
02-21    1200
02-22    1212
02-23    1224
  .       .
  .       .
03-19    1320

这应该有效。如果需要,将 SUM 更改为 MIN 或 MAX。

SELECT A.`Date`,SUM(A.`num`*B.`val`) AS `total`
FROM `TableA` A 
LEFT JOIN `Tableb` B
    ON B.`Date` >= A.`Date`
GROUP BY A.`Date`

这会产生您需要的结果。我没有看到需要 GROUP BY,你说你只想要日期 '02-20' 的结果,所以我只是添加了一个 WHERE 并将 SELECT 更改为抓取Table B 的约会对象。

SELECT
    B.Date,
    A.num * B.val AS total
FROM TableA A
LEFT JOIN Tableb B ON B.Date >= A.Date
WHERE A.Date = '02-20'

NOTE : You should avoid using reserved keywords as table/column name.

好了,给你..

SELECT b.`date`,max(a.`num`*b.`val`) AS `total`
FROM test a 
LEFT JOIN `test2` b
    ON b.`date` >= a.`date`
WHERE b.date is not null
GROUP BY b.`dates`;

sqlfiddle : http://www.sqlfiddle.com/#!9/55c0e1/1