🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1170閲覧

【SQL書き方】GROUP BY したあとに、特定のカラム内でCOUNTする方法

katahik

総合スコア79

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/01/17 10:26

編集2021/01/17 20:17

閲覧いただきありがとうございます。
SQL文の書き方について、詰まってしまったので、ご教授いただければ幸いです。

現状

  • itemsテーブル
idsession_iditem_idcompetition_id
1121
2131
2121
2121
2152
3172
4142
5152

実現したいこと

competition_idでグルーピングしてから、
item_id内で同じ数字をカウントしていき、最も多かった数字とその個数を抽出。

例えば、
competition_idが1の場合は、item_idは2が最多で、その個数は3
competition_idが2の場合は、item_idは5が最多で、その個数は2
competition_idが3の場合は、・・・
competition_idが4の場合は、・・・

試したこと

SELECT item_id,competition_id FROM items GROUP BY competition_id;

結果
2|1
7|2
など、competition_idで場合分けされていることがわかった。

SELECT temp.item_id FROM (SELECT item_id,count(*) cnt2 FROM items GROUP BY item_id) temp WHERE temp.cnt2 = (SELECT max(cnt) FROM (SELECT competition_id,count(*) cnt FROM items GROUP BY item_id ) num );

結果
28
62
item_idごとの合計の最大値をとったitem_idは28と62ということがわかったが、competition_idでグループ分けしてからの方法がわからなかった。

環境

macOS BigSur
ruby 2.7.0
Rails 6.1.1
sqlite

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんな感じでいかがでしょうか。

sqlite> create table items (id int, session_id int, item_id int, competition_id int); sqlite> insert into items values (1, 1, 2, 1), (2, 1, 3, 1), (2, 1, 2, 1), (2, 1, 2, 1), (2, 1, 5, 2), (3, 1, 7, 2), (4, 1, 4, 2), (5, 1, 5, 2); sqlite> .mode column sqlite> select * from items; id session_id item_id competition_id ---------- ---------- ---------- -------------- 1 1 2 1 2 1 3 1 2 1 2 1 2 1 2 1 2 1 5 2 3 1 7 2 4 1 4 2 5 1 5 2 sqlite> select competition_id, item_id, count(*) as count from items group by competition_id, item_id; competition_id item_id count -------------- ---------- ---------- 1 2 3 1 3 1 2 4 1 2 5 2 2 7 1 sqlite> select *, rank() over (partition by competition_id order by count desc) as rank from (select competition_id, item_id, count(*) as count from items group by competition_id, item_id) as t; competition_id item_id count rank -------------- ---------- ---------- ---------- 1 2 3 1 1 3 1 2 2 5 2 1 2 4 1 2 2 7 1 2 sqlite> select * from (select *, rank() over (partition by competition_id order by count desc) as rank from (select competition_id, item_id, count(*) as count from items group by competition_id, item_id) as t) as tt where rank = 1; competition_id item_id count rank -------------- ---------- ---------- ---------- 1 2 3 1 2 5 2 1

清書した SQL

sql

1select 2 * 3from ( 4 select 5 *, 6 rank() over (partition by competition_id order by count desc) as rank 7 from ( 8 select 9 competition_id, 10 item_id, 11 count(*) as count 12 from items 13 group by competition_id, item_id 14 ) as t 15) as tt 16where rank = 1;

投稿2021/01/17 12:48

hoshi-takanori

総合スコア7899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katahik

2021/01/17 21:56

hoshi-takanori 様 ご回答ありがとうございました。 無事、欲しいデータを抽出することができました。 恥ずかしながら、分析関数というものを知りませんでした。 また、GROUP BYで複数のカラムを指定できることも知りませんでした。 勉強になりました。 ありがとうございました。
guest

0

SQLiteのバージョンによるだろうけど、SQLite3版 分析関数(ウインドウ関数) コードサンプルが使えるかも?

投稿2021/01/17 12:48

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問