GROUP BY
参考:
ActiveRecord における GROUP BY の使い方 – Qiita
group / group_by
group
:ActiveRecord
のメソッド (SQL 実行時にグループ化する)group_by
:Enumerable
のメソッド (レコードの配列をグループ化する)
参考:
group_by のときに使う &:hogehoge ってなに? | paranitips
group – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
Enumerable#group_by | Ruby リファレンスマニュアル [公式]
GROUP BY の COUNT を取る
カラムの値毎に集計する。
User.group(:prefecture_id).count
集計結果の多い順にソートする。
User.group(:prefecture_id).order(count_all: :desc).count
参考:
Rails で group by して count を取りたい時のイディオム | h365info’s blog
ActiveRecord 4 での集計をいろいろまとめた | Scimpr Blog
Rails の model で各データが何個あるかカウントする | joppot
GROUP BY and COUNT using ActiveRecord – Stack Overflow
集計結果でソートする
Post.group(:category_id).order(count_category_id: :desc).count(:category_id)
参考:
ActiveRecord で GROUP BY してカウントをして、カウント数で ORDER する – GitHub Gist
GROUP BY の COUNT をリレーションとして取得する
ユーザーのレコードに投稿数を追加して取得する。
users = User \ .joins(:posts) \ .select('users.*, count("posts.id") as posts_count') \ .group_by(:id) \ .map(&:attributes)
発行される SQL
SELECT users.*, count(posts.id) as posts_count FROM "users" INNER JOIN "users_posts" ON "posts"."user_id" = "users"."id" GROUP BY "users"."id"
参考:
ActiveRecord で group_by count による集計結果を relation として取得する – Qiita
Rails で group by を使って、0も考慮しながら合計値を出す方法 | 地方でリモートワーク
select
参考:
Rails 4 JOIN GROUP BY and SELECT – Stack Overflow
Rails 3 ActiveRecord: order and group by association count – Stack Overflow
関連モデルのカラムで GROUP BY して集計する
コメントのユーザー ID でグループ化して投稿を集計する。
Posts.joins(:comments).group(Comment.arel_table[:user_id]).count
参考:
ActiveRecord で外部キーで GROUP BY して集計するとき関連先のカラムを使ってグループ分けするには? – スタック・オーバーフロー
複数のカラムで集計する
参考:
複数の要素で groupし、count した結果を整形したい。- Qiita
group メソッドで月ごとの集計を取りたいが、別の年のレコードも混ざってしまう。 – teratail
関連レコードをグループ毎に集計する
参考:
Group and count in Rails – Stack Overflow
sum
参考:
group and count by nested association in rails – Stack Overflow
values
参考:
Rails のモデルを指定した複数のフィールドで group_by する方法が見つかりません! – teratail
ORDER BY をサブクエリで実行する
参考:
Ruby on Rails で group by と order by を組み合わせて使う方法 – Qiita
HAVING
参考:
Group, count, having, and order by in Rails – Stack Overflow
日付で GROUP BY
MySQL の場合
scope :group_by_date, -> { group("DATE( CONVERT_TZ( created_at, 'UTC', 'Asia/Tokyo' ) )") }
SQLite の場合
scope :group_by_date, -> { group("DATE( DATETIME( created_at, '+9 hour' ) )") }
参考:
ActiveRecord で datetime 型カラムの GROUP BY 集計にタイムゾーンを考慮する | EasyRamble
CONVERT_TZ (dt,from_tz,to_tz) | MySQL 快適リファレンス検索
ActiveRecord で日付ごとに group by したい | 機略戦記
CONVERT_TZ | MySQL 5.6 リファレンスマニュアル [公式]
Does sqlite3 has analogue MySQL’s CONVERT_TZ function? – Stack Overflow