我正在尝试编写一个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
答案 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