修改左连接子句

时间:2018-04-21 19:26:41

标签: sql impala

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

表A

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

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

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

现在我们想要每天使用日期02-20的A.num(期间的开始日期)计算02-20和03-20之间的总值。例如,02-21的总值为100 * 12,02-22为101 * 12,33-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

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

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

修改

示例输出

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

3 个答案:

答案 0 :(得分:2)

这应该有效。如果需要,将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`

答案 1 :(得分:0)

这会产生您需要的结果。我没有看到GROUP BY的需要,你说你只想要日期' 02-20'的结果,所以我只添加了WHERE并更改了SELECT抓住表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'

答案 2 :(得分:0)

  

注意:您应该避免使用const managers = employeesByDepartment[employee.department].managers; const thisManagerAlreadyAdded = !!managers.find(manager => manager.id === employee.manager); if (!thisManagerAlreadyAdded) { managers.push(ReturnOneUser(employee.manager)); } 作为表/列名称。

嗯,你走了..

reserved keywords

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