Hive 配置单元-错误:在'处缺少EOF;其中';
我正在努力学习Hive,特别是像unix时间戳和unixtime中的Hive 配置单元-错误:在'处缺少EOF;其中';,hive,hiveql,Hive,Hiveql,我正在努力学习Hive,特别是像unix时间戳和unixtime中的unix\u timestamp和这样的函数 我有三张桌子 emp (employee table) +---+----------------+ | id| name| +---+----------------+ | 1| James Gordon| | 2| Harvey Bullock| | 3| Kristen Kringle| +---+----------------+ txn
unix\u timestamp
和这样的函数
我有三张桌子
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|
+---+------+--------+
我想找出2018年1月trans\u amt
超过cred\u 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;
但是当我运行它的时候,我得到一个错误
FAILED: ParseException line 9:2 missing EOF at 'WHERE' near 'month'
即使我将where子句更改为
WHERE tabl.total_amt > cred_lim;
这使我认为错误来自GROUPBY
子句,但我似乎无法理解这一点
有人能帮我吗?您的查询有几个问题
WHERE
子句应在groupby
在分组依据
列之后有一个额外的)'
tabl.total\u amt>cred\u 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);
额外的“)”是一个打字错误。但是你给出的解决方案非常有效。谢谢