GROUP BY

参考:

ActiveRecord における GROUP BY の使い方 – Qiita

group / group_by

  • groupActiveRecord のメソッド (SQL 実行時にグループ化する)
  • group_byEnumerable のメソッド (レコードの配列をグループ化する)

参考:

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

いいね!数の多い順での記事の表示 – teratail

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

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA