Na consulta a seguir, preciso contar as transações de cada cliente. No entanto, tenho que excluir totalmente do conjunto de resultados os clientes que possuem uma transação com mais de um ano.
O otimizador de consulta não deveria ser inteligente o suficiente para avaliar a existência apenas uma vez para cada cliente?
--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
Não há recursos naturais em meu plano de consulta. Essa consulta está sendo executada como se o banco de dados estivesse executando a cláusula de existência para cada transação, em vez de executá-la para cada cliente. O desempenho é o mesmo se eu remover o GROUP BY
na subconsulta.
Existe uma maneira melhor de fazer isso para que eu possa obter um melhor desempenho do banco de dados? Esperançosamente, uma consulta simples SELECT
funcionará evitando um CTE, se possível (isso apresentaria outros desafios).
Devido a outros GROUP BY
critérios (não mostrados aqui) não estou conseguindo simplesmente verificar MIN(DATED)
, preciso muito realizar outra consulta.