我正在尝试在运行下面的查询时创建一个新列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';
什么可能导致此错误?
答案 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
子句将过滤掉所有行。