MySQL / MariaDB中PERCENTILE_CONT的替代方案

时间:2016-06-14 06:30:45

标签: mysql oracle mariadb analytic-functions

enter image description here

我想在这张桌子上计算percentile_cont。 在Oracle中,查询将是

SELECT PERCENTILE_CONT(0.05) FROM sometable;

在MariaDB / MySQL中它的替代品是什么?

4 个答案:

答案 0 :(得分:1)

在MariaDB或MySQL中没有内置函数,所以你必须在SQL级别上解决这个问题(或者通过添加用C语言编写的用户定义函数)。

这可能有助于提出SQL解决方案:

http://rpbouman.blogspot.de/2008/07/calculating-nth-percentile-in-mysql.html

答案 1 :(得分:1)

MariaDB 10.2具有窗口函数。

对于MySQL /较旧的MariaDB,假设您只想要一组值的第N个百分位数。

这是最好的表单应用程序代码,但可以构建到存储的例程中。

  1. 计算总行数:SELECT COUNT(*) FROM tbl
  2. 使用SELECT构建并执行LIMIT n,1,其中n计算为百分位数乘以计数,然后填入查询。
  3. 如果需要在两个值之间进行插值,则会变得更加混乱。你也需要吗?

答案 2 :(得分:1)

self.navigationViewController.pushViewController(viewController, animated: true) viewController.bind(to: viewModel) 介绍了MariaDB 10.3.3PERCENTILE_CONTPERCENTILE_DISC窗口函数。

  

PERCENTILE_CONT

     

PERCENTILE_CONT()(代表连续百分位数)是一个有序集合聚合函数,也可以用作窗口函数。它返回一个值,该值对应于排序顺序中的给定分数。如果需要,它将在相邻的输入项之间进行插值。

MEDIAN

答案 3 :(得分:1)

虽然MariaDB 10.3.3以窗口函数(see Lukasz Szozda's answer)的形式支持这些函数,但是您也可以在MySQL 8中使用窗口函数来仿真它们:

SELECT DISTINCT first_value(matrix_value) OVER (
  ORDER BY CASE WHEN p <= 0.05 THEN p END DESC /* NULLS LAST */
) x,
FROM (
  SELECT
    matrix_value,
    percent_rank() OVER (ORDER BY matrix_value) p,
  FROM some_table
) t;

I've blogged about this more in detail here