我正在尝试学习Hive,尤其是int arr[size];
和unix_timestamp
等功能。
我有三张桌子
from_unixtime
我想找出那些在{201}年1月emp (employee table)
+---+----------------+
| id| name|
+---+----------------+
| 1| James Gordon|
| 2| Harvey Bullock|
| 3| Kristen Kringle|
+---+----------------+
txn (transaction table)
+------+----------+---------+
|acc_id|trans_date|trans_amt|
+------+----------+---------+
| 101| 20180105| 951|
| 102| 20180205| 800|
| 103| 20180131| 100|
| 101| 20180112| 50|
| 102| 20180126| 800|
| 103| 20180203| 500|
+------+----------+---------+
acc (account table)
+---+------+--------+
| id|acc_id|cred_lim|
+---+------+--------+
| 1| 101| 1000|
| 2| 102| 1500|
| 3| 103| 800|
+---+------+--------+
超过trans_amt
的人。
我正在尝试使用的查询是
cred_lim
但是当我运行它时,我收到错误说
WITH tabl as
(
SELECT e.id, e.name, a.acc_id, t.trans_amt, a.cred_lim, from_unixtime(unix_timestamp(t.trans_date, 'yyyyMMdd'), 'MMM yyyy') month
FROM emp e JOIN acc a on e.id = a.id JOIN txn t on a.acc_id = t.acc_id
)
SELECT acc_id, sum(trans_amt) total_amt
FROM tabl
GROUP BY tabl.acc_id, tabl.month
WHERE tabl.month = 'Jan 2018' AND tabl.total_amt > cred_lim;
即使我将where子句更改为
,此错误仍然存在FAILED: ParseException line 9:2 missing EOF at 'WHERE' near 'month'
这让我觉得错误来自WHERE tabl.total_amt > cred_lim;
条款,但我似乎无法解决这个问题。
有人可以帮我这个吗?
答案 0 :(得分:1)
您的查询有几个问题。
应在WHERE
之前使用 GROUP BY
子句
')'
列之后还有GROUP BY
个
tabl.total_amt > cred_lim
- 此行不能用于哪里
因为别名total_amt
在它之前不能使用
嵌套。相反,请使用HAVING
子句。
我已在此查询中进行了这些更改,应该适合您。
WITH tabl
AS (
SELECT e.id
,e.name
,a.acc_id
,t.trans_amt
,a.cred_lim
,from_unixtime(unix_timestamp(t.trans_date, 'yyyyMMdd'), 'MMM yyyy') month
FROM emp e
INNER JOIN acc a ON e.id = a.id
INNER JOIN txn t ON a.acc_id = t.acc_id
)
SELECT acc_id
,sum(trans_amt) total_amt
FROM tabl
WHERE month = 'Jan 2018'
GROUP BY acc_id
,month
HAVING SUM(trans_amt) > MAX(cred_lim);