数値行の中央値を計算したいと思います。SQLite 4でそれを行うにはどうすればよいですか?
5 に答える
中央値が順序付きリストの真ん中にある要素だとしましょう。
SQLite (4 または 3) にはそのための組み込み関数はありませんが、手動でこれを行うことができます。
SELECT x
FROM MyTable
ORDER BY x
LIMIT 1
OFFSET (SELECT COUNT(*)
FROM MyTable) / 2
レコード数が偶数の場合、中間の 2 つのレコードの平均を中央値と定義するのが一般的です。この場合、平均は次のように計算できます。
SELECT AVG(x)
FROM (SELECT x
FROM MyTable
ORDER BY x
LIMIT 2
OFFSET (SELECT (COUNT(*) - 1) / 2
FROM MyTable))
奇数と偶数のケースを組み合わせると、次のようになります。
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))
sqlite3 用のさまざまな数学関数の拡張パックがあります。中央値などのグループ関数が含まれています。
CLの答えよりもこれを実現するのはより多くの作業になりますが、他の機能が必要になると思われる場合は価値があるかもしれません.
http://www.sqlite.org/contrib/download/extension-functions.c?get=25
( SQLite 拡張機能をコンパイルしてロードする方法のガイドはこちらです。)
説明から:
ロード可能な拡張メカニズムを使用して、SQL クエリに数学および文字列拡張関数を提供します。数学: acos、asin、atan、atn2、atan2、acosh、asinh、atanh、差、度、ラジアン、cos、sin、tan、cot、cosh、sinh、tanh、coth、exp、log、log10、power、sign、平方根、平方、天井、床、円周率。文字列: レプリケート、charindex、leftstr、rightstr、ltrim、rtrim、trim、replace、reverse、proper、padl、padr、padc、strfilter。集計: stdev、分散、最頻値、中央値、lower_quartile、upper_quartile。
UPDATE 2015-04-12: 「未定義のシンボル: sinh」の修正
コメントで述べたように、この拡張機能はコンパイルが成功しても正しく動作しない可能性があります。
たとえば、コンパイルが機能し、Linux では、結果の .so ファイルを .so ファイルにコピーできます/usr/local/lib
。ただし.load /usr/local/lib/libsqlitefunctions
、sqlite3
シェルから次のエラーが生成される場合があります。
Error: /usr/local/lib/libsqlitefunctions.so: undefined symbol: sinh
このようにコンパイルするとうまくいくようです:
gcc -fPIC -shared extension-functions.c -o libsqlitefunctions.so -lm
.so
ファイルをコピーし/usr/local/lib
ても、同様のエラーは表示されません。
sqlite> .load /usr/local/lib/libsqlitefunctions
sqlite> select cos(pi()/4.0);
---> 0.707106781186548
この特定のケースで gcc のオプションの順序が重要な理由はわかりませんが、明らかに重要です。
これに気付いた功績は、このブログ投稿に対するLudvick Lidickyのコメントにあります。