交叉加入蜂巢

时间:2020-08-23 21:01:56

标签: sql datetime join hive window-functions

我正在尝试在运行下面的查询时创建一个新列time_period。如果给定交易与参考表中最新交易之间的日期差少于7天,则将其标记为recent交易,否则将其标记为old交易。

但是,下面的查询在与交叉联接关联的子查询中生成错误。错误是“无法识别'select''('max'

附近的输入
SELECT
    c.*
    FROM(
        SELECT
         a.acct_nb,
         a.txn_date,
         a.txn_amt,
         (CASE WHEN datediff(b.most_recent_txn,a.txn_date)<7 THEN 'recent' ELSE 'old' END) AS time_period
         FROM db.t1 a
         CROSS JOIN(
              SELECT max(txn_date) AS most_recent_txn --ERROR OCCURS HERE
              FROM db.t1 b)
        )c
        WHERE c.time_period='new';

什么可能导致此错误?

2 个答案:

答案 0 :(得分:2)

您不需要join。您可以只使用窗口功能:

SELECT 
    acct_nb,
    txn_date, 
    txn_amt,
    CASE WHEN DATEDIFF(MAX(txn_date) OVER(), txn_date) < 7 
        THEN 'recent' 
        ELSE 'old' 
    END AS time_period
FROM db.t1

如果仅需要过滤最近的交易,则可以使用子查询:

SELECT *
FROM (
    SELECT acct_nb, txn_date, txn_amt, MAX(txn_date) OVER() max_txn_date
    FROM db.t1
) t
WHERE DATEDIFF(MAX(txn_date) OVER(), txn_date) < 7 

答案 1 :(得分:1)

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

SELECT c.*
FROM (
  SELECT a.acct_nb, a.txn_date, a.txn_amt,
         CASE WHEN datediff(b.most_recent_txn, a.txn_date) < 7 THEN 'recent' ELSE 'old' END AS time_period
  FROM db.t1 a
  CROSS JOIN (
    SELECT max(txn_date) AS most_recent_txn
    FROM db.t1 
  ) b
) c
WHERE c.time_period='new';  

此外,您的CASE表达式中没有分支返回'new',因此最后一个WHERE子句将过滤掉所有行。