修改左连接子句
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*12 和 101*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
我正在尝试编写一个 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*12 和 101*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