hive中的cross join

yfwxisqw  于 2021-04-08  发布在  Hive
关注(0)|答案(2)|浏览(1012)

我试图在运行下面的查询时创建一个新的列 "time_period"。如果给定的事务和参考表中最近的事务之间的日期差小于7天,那么就将其标记为 "recent "事务,否则就将其标记为 "old "事务。
然而,下面的查询在与交叉连接相关的子查询中产生了一个错误,错误是“cannot recognize input near 'select' '(''max'”

  1. SELECT
  2. c.*
  3. FROM(
  4. SELECT
  5. a.acct_nb,
  6. a.txn_date,
  7. a.txn_amt,
  8. (CASE WHEN datediff(b.most_recent_txn,a.txn_date)<7 THEN 'recent' ELSE 'old' END) AS time_period
  9. FROM db.t1 a
  10. CROSS JOIN(
  11. SELECT max(txn_date) AS most_recent_txn --ERROR OCCURS HERE
  12. FROM db.t1 b)
  13. )c
  14. WHERE c.time_period='new';

是什么原因导致这个错误?

v6ylcynt

v6ylcynt1#

别名b应该应用于交叉连接的子查询,而不是应用于子查询中的表db.t1

  1. SELECT c.*
  2. FROM (
  3. SELECT a.acct_nb, a.txn_date, a.txn_amt,
  4. CASE WHEN datediff(b.most_recent_txn, a.txn_date) < 7 THEN 'recent' ELSE 'old' END AS time_period
  5. FROM db.t1 a
  6. CROSS JOIN (
  7. SELECT max(txn_date) AS most_recent_txn
  8. FROM db.t1
  9. ) b
  10. ) c
  11. WHERE c.time_period='new';

另外,你的CASE表达式中没有返回'new的分支,所以最后一个WHERE子句会过滤掉所有的行。

cs7cruho

cs7cruho2#

你不需要 "连接",你可以使用窗口函数。

  1. SELECT
  2. acct_nb,
  3. txn_date,
  4. txn_amt,
  5. CASE WHEN DATEDIFF(MAX(txn_date) OVER(), txn_date) < 7
  6. THEN 'recent'
  7. ELSE 'old'
  8. END AS time_period
  9. FROM db.t1

如果你只需要过滤最近的交易,那么你可以使用一个子查询。

  1. SELECT *
  2. FROM (
  3. SELECT acct_nb, txn_date, txn_amt, MAX(txn_date) OVER() max_txn_date
  4. FROM db.t1
  5. ) t
  6. WHERE DATEDIFF(MAX(txn_date) OVER(), txn_date) < 7
展开查看全部

相关问题