首页 > 解决方案 > 使用 Oracle 分析函数加速 COUNT DISTINCT

问题描述

我必须得到一个查询才能更好地执行:

SELECT COUNT(DISTINCT T.ID)
  FROM MY_TABLE T
 WHERE T.DATE BETWEEN ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6) AND
       LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy'));

此查询输出参考日期前 6 个月内该标志的不同出现次数。

我尝试使用 Oracle Analytic 函数,但没有一个示例在网上找到工作,也没有我得出的结果:

SELECT COUNT(DISTINCT T.ID) OVER(RANGE BETWEEN ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6) AND LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy')))
  FROM MY_TABLE T;

我是否遗漏了某些东西,或者我想要完成的事情根本不值得分析功能,或者只是错了?

提前致谢。

标签: sqloraclefunction

解决方案


您可以尝试使用 GROUP BY。有时,是最快的。如果您在 DATE 字段上没有索引,则可以使用并行选项执行全表扫描。

SELECT COUNT(1) FROM
(SELECT /*+ FULL(T) PARALLEL(T)*/ T.ID
FROM MY_TABLE T
WHERE T.DATE BETWEEN 
ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6) 
AND
LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy'))
GROUP BY T.ID);

推荐阅读