在以下查询中,我必须计算每个客户的交易。但是,我必须从结果集中完全排除交易超过一年的客户。
查询优化器不应该足够聪明,只为每个客户评估一次存在吗?
--Count transactions on customers that are less than 1 year old
SELECT t1.CUSTID, COUNT(*)
FROM CUST_TRX t1
WHERE NOT EXISTS (
SELECT FIRST 1 1
FROM CUST_TRX t2
WHERE
t2.CUSTID = t1.CUSTID AND
t2.DATED < CURRENT_DATE - 365
GROUP BY t2.CUSTID
)
GROUP BY t1.CUSTID
我的查询计划中没有自然。此查询的执行就像数据库为每个事务运行存在子句,而不是为每个客户运行它。GROUP BY
如果我删除子查询中的 ,性能是相同的。
有没有更好的方法来做到这一点,以便我可以从数据库中获得更好的性能?如果可能的话,希望一个简单的SELECT
查询能够避免 CTE(这会带来其他挑战)。
由于其他GROUP BY
条件(此处未显示),我无法简单地检查MIN(DATED)
,我真的需要执行另一个查询。