Oracle兼容-语法-RATIO_TO_REPORT


1. 语法

  1. SET sql_mode = ORACLE;
  2. RATIO_TO_REPORT(expr)
  3. OVER ([ query_partition_clause ])

2. 定义和用法

想要使用 RATIO_TO_REPORT 需要先切换到ORACLE模式下,RATIO_TO_REPORT 可用于数据占比分析,其分析公式为:结果 = 字段值/sum(字段)

3. Oracle兼容说明

在GreatSQL和Oracle中的 RATIO_TO_REPORT 用法一致,具体实现功能如下:

  1. RATIO_TO_REPORT(expr) OVER (query_partition_clause) 对分组数据进行占比分析。

  2. RATIO_TO_REPORT(expr) OVER () 对所有数据进行占比分析。

  3. 在Oracle中不支持字符值使用 RATIO_TO_REPORT,但因GreatSQL中会自动隐式转换,支持这么用。

  4. 在GreatSQL中不支持ENUMSETJSONGEOMETRY、时间等多个类型数据使用 RATIO_TO_REPORT

  5. RATIO_TO_REPORT 分析的结果小数位数为该字段的小数位加上系统参数 @@div_precision_increment 的和。

  6. 字段值为NULL''相加和为0等几种情况下,RATIO_TO_REPORT 的结果为 NULL

  7. 在GreatSQL中支持 BIT 类型字段用于 RATIO_TO_REPORT

  8. 当于计算时数值过大产生溢出的情况,将按照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. );
  6. greatsql> INSERT INTO t1(sidea,sideb) VALUES(1,2),(10,20),(null,null),(-1,20),(10,-100),(10,-123);
  7. greatsql> SELECT * FROM t1;
  8. +-------+-------+----------------+
  9. | sidea | sideb | sidec |
  10. +-------+-------+----------------+
  11. | 1 | 2 | 2.2360679775 |
  12. | 10 | 20 | 22.360679775 |
  13. | NULL | NULL | NULL |
  14. | -1 | 20 | 20.0249843945 |
  15. | 10 | -100 | 100.4987562112 |
  16. | 10 | -123 | 123.405834546 |
  17. +-------+-------+----------------+
  18. 6 rows in set (0.00 sec)
    1. RATIO_TO_REPORT over (partition by) 对分组数据进行占比分析。
  1. greatsql> SET sql_mode = ORACLE;
  2. -- 查看 @@div_precision_increment
  3. greatsql> SELECT @@div_precision_increment;
  4. +---------------------------+
  5. | @@div_precision_increment |
  6. +---------------------------+
  7. | 4 |
  8. +---------------------------+
  9. greatsql> SELECT sidec, sidea, RATIO_TO_REPORT(sidec) OVER (PARTITION BY sidea) c FROM t1;
  10. +----------------+-------+------------------+
  11. | sidec | sidea | c |
  12. +----------------+-------+------------------+
  13. | NULL | NULL | NULL |
  14. | 20.0249843945 | -1 | 1 |
  15. | 2.2360679775 | 1 | 1 |
  16. | 22.360679775 | 10 | 0.09079916029847 |
  17. | 100.4987562112 | 10 | 0.40809146979602 |
  18. | 123.405834546 | 10 | 0.50110936990551 |
  19. +----------------+-------+------------------+
  20. 6 rows in set (0.00 sec)
  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. +-------+-------+---------+
  32. 6 rows in set (0.01 sec)
    1. RATIO_TO_REPORT OVER() 对所有数据进行占比分析。
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> SELECT sidec, sidea, RATIO_TO_REPORT(sidec) OVER () c FROM t1;
  3. +----------------+-------+------------------+
  4. | sidec | sidea | c |
  5. +----------------+-------+------------------+
  6. | 2.2360679775 | 1 | 0.00832718354505 |
  7. | 22.360679775 | 10 | 0.08327183545048 |
  8. | NULL | NULL | NULL |
  9. | 20.0249843945 | -1 | 0.07457363649836 |
  10. | 100.4987562112 | 10 | 0.37426035229721 |
  11. | 123.405834546 | 10 | 0.4595669922089 |
  12. +----------------+-------+------------------+
  13. 6 rows in set (0.01 sec)
    1. 字段相加的和为0
  1. -- 再新写入两条记录
  2. greatsql> INSERT INTO t1(sidea,sideb) VALUES (20,100),(20,-100);
  3. greatsql> SELECT * FROM t1;
  4. +-------+-------+----------------+
  5. | sidea | sideb | sidec |
  6. +-------+-------+----------------+
  7. | 1 | 2 | 2.2360679775 |
  8. | 10 | 20 | 22.360679775 |
  9. | NULL | NULL | NULL |
  10. | -1 | 20 | 20.0249843945 |
  11. | 10 | -100 | 100.4987562112 |
  12. | 10 | -123 | 123.405834546 |
  13. | 20 | 100 | 101.9803902719 |
  14. | 20 | -100 | 101.9803902719 |
  15. +-------+-------+----------------+
  16. 8 rows in set (0.00 sec)
  17. greatsql> SET sql_mode = ORACLE;
  18. greatsql> SELECT sideb, sidea, RATIO_TO_REPORT(sideb) OVER (PARTITION BY sidea) c FROM t1;
  19. +-------+-------+---------+
  20. | sideb | sidea | c |
  21. +-------+-------+---------+
  22. | NULL | NULL | NULL |
  23. | 20 | -1 | 1 |
  24. | 2 | 1 | 1 |
  25. | 20 | 10 | -0.0985 |
  26. | -100 | 10 | 0.4926 |
  27. | -123 | 10 | 0.6059 |
  28. | 100 | 20 | NULL |
  29. | -100 | 20 | NULL |
  30. +-------+-------+---------+
  31. 8 rows in set (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx