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)
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.
正如评论中所提到的,尽管编译成功,但此扩展可能无法正常工作.
例如,编译可能有效,在Linux上,您可以将生成的.so文件复制到/usr/local/lib.但是.load /usr/local/lib/libsqlitefunctions从sqlite3shell可能会生成此错误:
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对此博客文章的评论