Oracle兼容-语法-RATIO_TO_REPORT
1. 语法
1. SET sql_mode = ORACLE;
3. RATIO_TO_REPORT(expr)
4. OVER ([ query_partition_clause ])
2. 定义和用法
想要使用 RATIO_TO_REPORT 需要先切换到ORACLE模式下,RATIO_TO_REPORT 可用于数据占比分析,其分析公式为:结果 = 字段值/sum(字段)。
3. Oracle兼容说明
在GreatSQL和Oracle中的 RATIO_TO_REPORT 用法一致,具体实现功能如下:
RATIO_TO_REPORT(expr) OVER (query_partition_clause)对分组数据进行占比分析。RATIO_TO_REPORT(expr) OVER ()对所有数据进行占比分析。- 在Oracle中不支持字符值使用
RATIO_TO_REPORT,但因GreatSQL中会自动隐式转换,支持这么用。 - 在GreatSQL中不支持
ENUM、SET、JSON、GEOMETRY、时间等多个类型数据使用RATIO_TO_REPORT。 RATIO_TO_REPORT分析的结果小数位数为该字段的小数位加上系统参数@@div_precision_increment的和。- 字段值为
NULL、''及相加和为0等几种情况下,RATIO_TO_REPORT的结果为NULL。 - 在GreatSQL中支持
BIT类型字段用于RATIO_TO_REPORT。 - 当于计算时数值过大产生溢出的情况,将按照GreatSQL原生的方式来处理。
4. 示例
创建测试表并填充数据:
1. greatsql> CREATE TABLE `t1` (
2. sidea INT DEFAULT NULL,
3. sideb INT DEFAULT NULL,
4. sidec DECIMAL(50,10) GENERATED ALWAYS AS (SQRT(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) VIRTUAL
5. );
7. greatsql> INSERT INTO t1(sidea,sideb) VALUES(1,2),(10,20),(null,null),(-1,20),(10,-100),(10,-123);
8. greatsql> SELECT * FROM t1;
9. +-------+-------+----------------+
10. | sidea | sideb | sidec |
11. +-------+-------+----------------+
12. | 1 | 2 | 2.2360679775 |
13. | 10 | 20 | 22.360679775 |
14. | NULL | NULL | NULL |
15. | -1 | 20 | 20.0249843945 |
16. | 10 | -100 | 100.4987562112 |
17. | 10 | -123 | 123.405834546 |
18. +-------+-------+----------------+
19. 6 rows in set (0.00 sec)
-
RATIO_TO_REPORT over (partition by)对分组数据进行占比分析。
1. greatsql> SET sql_mode = ORACLE;
3. -- 查看 @@div_precision_increment 值
4. greatsql> SELECT @@div_precision_increment;
5. +---------------------------+
6. | @@div_precision_increment |
7. +---------------------------+
8. | 4 |
9. +---------------------------+
11. greatsql> SELECT sidec, sidea, RATIO_TO_REPORT(sidec) OVER (PARTITION BY sidea) c FROM t1;
12. +----------------+-------+------------------+
13. | sidec | sidea | c |
14. +----------------+-------+------------------+
15. | NULL | NULL | NULL |
16. | 20.0249843945 | -1 | 1 |
17. | 2.2360679775 | 1 | 1 |
18. | 22.360679775 | 10 | 0.09079916029847 |
19. | 100.4987562112 | 10 | 0.40809146979602 |
20. | 123.405834546 | 10 | 0.50110936990551 |
21. +----------------+-------+------------------+
22. 6 rows in set (0.00 sec)
24. greatsql> SELECT sideb, sidea, RATIO_TO_REPORT(sideb) OVER (PARTITION BY sidea) c FROM t1;
25. +-------+-------+---------+
26. | sideb | sidea | c |
27. +-------+-------+---------+
28. | NULL | NULL | NULL |
29. | 20 | -1 | 1 |
30. | 2 | 1 | 1 |
31. | 20 | 10 | -0.0985 |
32. | -100 | 10 | 0.4926 |
33. | -123 | 10 | 0.6059 |
34. +-------+-------+---------+
35. 6 rows in set (0.01 sec)
-
RATIO_TO_REPORT OVER()对所有数据进行占比分析。
1. greatsql> SET sql_mode = ORACLE;
3. greatsql> SELECT sidec, sidea, RATIO_TO_REPORT(sidec) OVER () c FROM t1;
4. +----------------+-------+------------------+
5. | sidec | sidea | c |
6. +----------------+-------+------------------+
7. | 2.2360679775 | 1 | 0.00832718354505 |
8. | 22.360679775 | 10 | 0.08327183545048 |
9. | NULL | NULL | NULL |
10. | 20.0249843945 | -1 | 0.07457363649836 |
11. | 100.4987562112 | 10 | 0.37426035229721 |
12. | 123.405834546 | 10 | 0.4595669922089 |
13. +----------------+-------+------------------+
14. 6 rows in set (0.01 sec)
-
- 字段相加的和为0
1. -- 再新写入两条记录
2. greatsql> INSERT INTO t1(sidea,sideb) VALUES (20,100),(20,-100);
4. greatsql> SELECT * FROM t1;
5. +-------+-------+----------------+
6. | sidea | sideb | sidec |
7. +-------+-------+----------------+
8. | 1 | 2 | 2.2360679775 |
9. | 10 | 20 | 22.360679775 |
10. | NULL | NULL | NULL |
11. | -1 | 20 | 20.0249843945 |
12. | 10 | -100 | 100.4987562112 |
13. | 10 | -123 | 123.405834546 |
14. | 20 | 100 | 101.9803902719 |
15. | 20 | -100 | 101.9803902719 |
16. +-------+-------+----------------+
17. 8 rows in set (0.00 sec)
19. greatsql> SET sql_mode = ORACLE;
21. greatsql> SELECT sideb, sidea, RATIO_TO_REPORT(sideb) OVER (PARTITION BY sidea) c FROM t1;
22. +-------+-------+---------+
23. | sideb | sidea | c |
24. +-------+-------+---------+
25. | NULL | NULL | NULL |
26. | 20 | -1 | 1 |
27. | 2 | 1 | 1 |
28. | 20 | 10 | -0.0985 |
29. | -100 | 10 | 0.4926 |
30. | -123 | 10 | 0.6059 |
31. | 100 | 20 | NULL |
32. | -100 | 20 | NULL |
33. +-------+-------+---------+
34. 8 rows in set (0.00 sec)
问题反馈
联系我们
扫码关注微信公众号

