如何计算SQLite中的值的中位数?

maf*_*afu 22 sqlite median

我想计算数字行中的中值.我怎么能在SQLite 4中做到这一点?

CL.*_*CL. 29

假设中位数是有序列表中间的元素.

SQLite(4或3)没有任何内置函数,但可以手动完成:

SELECT x
FROM MyTable
ORDER BY x
LIMIT 1
OFFSET (SELECT COUNT(*)
        FROM MyTable) / 2
Run Code Online (Sandbox Code Playgroud)

当存在偶数个记录时,通常将中值定义为两个中间记录的平均值.在这种情况下,平均值可以这样计算:

SELECT AVG(x)
FROM (SELECT x
      FROM MyTable
      ORDER BY x
      LIMIT 2
      OFFSET (SELECT (COUNT(*) - 1) / 2
              FROM MyTable))
Run Code Online (Sandbox Code Playgroud)

结合奇数和偶数情况,结果如下:

SELECT AVG(x)
FROM (SELECT x
      FROM MyTable
      ORDER BY x
      LIMIT 2 - (SELECT COUNT(*) FROM MyTable) % 2    -- odd 1, even 2
      OFFSET (SELECT (COUNT(*) - 1) / 2
              FROM MyTable))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案,但如果你想计算"分组依据"结果而不是整个表的中位数,似乎很难使用它.考虑通过grp"从表组中选择grp,min(val),median(val),max(val)". (5认同)

Pau*_*aul 15

sqlite3有各种数学函数的扩展包.它包括像中位数这样的组函数.

如果您认为自己需要任何其他功能,那么将比CL的答案更有效.

http://www.sqlite.org/contrib/download/extension-functions.c?get=25

(是如何编译和加载SQLite扩展的指南.)

来自描述:

使用可加载扩展机制为SQL查询提供数学和字符串扩展函数.数学:acos,asin,atan,atn2,atan2,acosh,asinh,atanh,difference,degrees,radians,cos,sin,tan,cot,cosh,sinh,tanh,coth,exp,log,log10,power,sign, sqrt,square,ceil,floor,pi.字符串:复制,charindex,leftstr,rightstr,ltrim,rtrim,trim,replace,reverse,proper,padl,padr,padc,strfilter.聚合:stdev,方差,模式,中位数,lower_quartile,upper_quartile.

更新2015-04-12:修复"未定义的符号:sinh"

正如评论中所提到的,尽管编译成功,但此扩展可能无法正常工作.

例如,编译可能有效,在Linux上,您可以将生成的.so文件复制到/usr/local/lib.但是.load /usr/local/lib/libsqlitefunctionssqlite3shell可能会生成此错误:

Error: /usr/local/lib/libsqlitefunctions.so: undefined symbol: sinh
Run Code Online (Sandbox Code Playgroud)

以这种方式编译它似乎工作:

gcc -fPIC -shared extension-functions.c -o libsqlitefunctions.so -lm
Run Code Online (Sandbox Code Playgroud)

并复制.so文件/usr/local/lib显示没有类似的错误:

sqlite> .load /usr/local/lib/libsqlitefunctions

sqlite> select cos(pi()/4.0);
---> 0.707106781186548
Run Code Online (Sandbox Code Playgroud)

我不确定为什么gcc的选项顺序在这种特殊情况下很重要,但显然确实如此.

值得注意的是Ludvick Lidicky对此博客文章的评论