Median and percentile for Active Record, Mongoid, arrays, and hashes
Supports:
- PostgreSQL 9.4+
- MariaDB 10.3.3+
- MySQL and SQL (with extensions)
- SQL Server 2012+
- MongoDB 2.1+
🔥 Uses native functions for blazing performance
Add this line to your application’s Gemfile:
gem 'active_median'
For MySQL and SQLite, also follow these instructions.
Median
Item.median(:price)
Percentile
Request.percentile(:response_time, 0.95)
Works with grouping, too
Order.group(:store_id).median(:total)
If passing user input as the column, be sure to sanitize it first like you must with other aggregate methods like sum
.
column = params[:column]
# check against permitted columns
raise "Unpermitted column" unless ["column_a", "column_b"].include?(column)
User.median(column)
Median
[1, 2, 3].median
Percentile
[1, 2, 3].percentile(0.95)
You can also pass a block
{a: 1, b: 2, c: 3}.median { |k, v| v }
MySQL requires the PERCENTILE_CONT
function from udf_infusion. To install it, do:
git clone https://github.com/infusion/udf_infusion.git
cd udf_infusion
./configure --enable-functions="percentile_cont"
make
sudo make install
mysql <options> < load.sql
SQLite requires a community extension. Download extension-functions.c and follow the instructions for compiling loadable extensions for your platform. On Mac, use:
gcc -g -fPIC -dynamiclib extension-functions.c -o extension-functions.dylib
To load it in Rails, create an initializer with:
db = ActiveRecord::Base.connection.raw_connection
db.enable_load_extension(1)
db.load_extension("extension-functions.dylib")
db.enable_load_extension(0)
A user-defined function is no longer needed for Postgres. Create a migration with ActiveMedian.drop_function
to remove it.
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features
To get started with development and testing:
git clone https://github.com/ankane/active_median.git
cd active_median
createdb active_median_test
bundle install
bundle exec rake test