flinksql你们用过中位数函数吗?各位大佬,如果要求中位数怎么实现呢,有没有相关的内置函数,还是[阿里云实时计算 Flink版]

flinksql你们用过中位数函数吗?各位大佬,如果要求中位数怎么实现呢,有没有相关的内置函数,还是说可以自定义开发一个udf来实现?可以实现的是吧?会不会运行很长时间之后对结果有影响,select id, company, salary from(select id, company, salary, cast(row_number() over(partition by company order by salary asc, id asc) as signed) as ‘id1’, cast(row_number() over(partition by company order by salary desc, id desc) as signed) as ‘id2’ from employee) as newtable where abs(id1-id2)=1 or id1=id2;你看看这个sql能不能实现,同一个字段,降序升序,然后取相等的,还是建议写自定义可以实现是吧,别人写的,我看看哪个方式合适

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
2 条回复 A 作者 M 管理员
  1. Flink SQL 中目前没有内置的中位数函数,但是可以通过自定义 UDF 或者使用 Flink 的内置函数库来实现中位数计算。

    一种实现中位数计算的方法是利用 Flink 的窗口函数和排序函数,具体步骤如下:

    使用窗口函数将所有数据分组并排序,得到有序数据集。

    计算数据集的总长度。

    如果数据集长度为偶数,则取中间两位数据的平均数作为中位数。

    如果数据集长度为奇数,则取中间一位数据作为中位数。

    下面是一个示例 SQL 语句,用于计算 salary 列的中位数:

    sql
    Copy
    SELECT AVG(salary)
    FROM (
    SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn, COUNT() OVER () AS cnt
    FROM my_table
    ) t
    WHERE rn IN (FLOOR((cnt+1)/2), FLOOR((cnt+2)/2))
    上述 SQL 语句使用了 ROW_NUMBER() 函数和 COUNT(
    ) OVER() 函数来对数据集进行排序和计数,并使用 FLOOR() 函数来计算中位数的位置。最后,使用 AVG() 函数计算中位数的值。

  2. 自定义,就求数组长度的二分之一取整所在索引,对应的数据,你搞这么复杂干嘛呢,先排序,再二分之一所在索引就行了 ,这种应该是数据是奇数个的时候才能这样吧,偶数个就不行 ,此回答整理自钉群“【③群】Apache Flink China社区”