sql - 使用 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;
我是否遗漏了某些东西,或者我想要完成的事情根本不值得分析功能,或者只是错了?
提前致谢。
解决方案
您可以尝试使用 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);
推荐阅读
- sql - 存储过程返回默认值?
- angular - Angular Mat 选择 CompareWith ID 号,并发出整个对象
- java - 如何对依赖于 Maven 本地存储库的 Java 应用程序进行 Docker 化?
- sql - 插入有条件的表
- mysql - SQL如何从所有产品行中获取总和而不丢失视图中的每个产品行
- jquery - 如何使用ajax jquery将多个变量从视图传递到控制器
- kubernetes - 在 Prometheus 中的范围向量上进行标签替换
- java - Spring boot+tomcat 性能:服务器发送事件 vs websocket vs old-school REST
- javascript - 如何将包含左浮动元素的元素居中?
- excel - 如何根据最新的单元格值再次重新运行宏