質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
SAP HANA

SAP HANA(エスエイピー ハナ)は、ドイツのソフトウェア企業SAP SEが提供するカラムストア指向リレーショナルインメモリーデータ処理プラットフォームです。

SQL

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

Q&A

解決済

5回答

2341閲覧

【SQL】カウントして一番多かった値を、複数個の場合は複数個返したい

nkrmn_a

総合スコア27

SAP HANA

SAP HANA(エスエイピー ハナ)は、ドイツのソフトウェア企業SAP SEが提供するカラムストア指向リレーショナルインメモリーデータ処理プラットフォームです。

SQL

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

0グッド

0クリップ

投稿2020/02/04 09:08

編集2020/02/13 01:22

SQLに不慣れで使いだしたばかりなので初歩的なものかと思いますが、よろしくお願いします。

前提・実現したいこと

下記のようなテーブル(AABB)があります。

AABB
a1
a2
a3
a1
a2
b1
b3
b2
b3
b4

これをSQLでどうにかして、

AABBmax
a12
a22
b32

というような結果を出したいです。

つまり、AAごとにBBが何個あるのかカウントし、一番多かったBBの値とその個数を、複数個ある場合は複数個返したいです。

試したこと

sql

1select AA, max(a.count) as max 2from ( 3 select AA, BB, count(BB)as count 4 from AABB 5 group by AA, BB 6) a 7group by a.AA order by AA;

上記のSQL文でMAXやCOUNTを使ってAAごとに何個ある、というものまでは出来たのですが、
GROUP BYで行っているため、AAごとに実行しようとすると複数個あった場合でも1つになってしまいます。

AAmax
a2
b3

また、BBの表示もできず…selectに入れてもBBごとにmaxが表示されるだけで、私でも違うと分かりました。

複数個ならWHERE句を使うというのも見かけましたが、どう使えばうまくいくのか分からず
エラーばかり出て迷走しております…

初歩的かと思いますが、教えてくださいませ。
よろしくお願いします。

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

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

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

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

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

Orlofsky

2020/02/04 09:25

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。
nkrmn_a

2020/02/04 09:34

ご指摘ありがとうございます。 hanaDBというデータベースを使っているのですが、タグに出て来ず、つけていませんでした。 あまり詳しくないので、何に近いのかなども分かっておらず… 質問文に追記しておきます。
nkrmn_a

2020/02/04 09:41

申し訳ないですが、初心者中の初心者のため修正をどうやってすればいいのか分かりません…。 今後のために勉強しておきます。
sazi

2020/02/05 01:02

単にデータベース名がhanaとかhanaDBとかじゃないんですよね? hanaDBというDBMSが見つかりません。 そのDBの説明のURLを教えてください。
nkrmn_a

2020/02/05 04:04

Orlofskyさん、saziさん そうです、こちらのSAP HANAを使用しております。 問い合わせもしてみます!ありがとうございます。
guest

回答5

0

SAP HANAプラットフォーム向けSAP HANA SQLリファレンスガイドによるとwithも使えるみたいなので、以下の様にしてみました。
CTEを使用した方が高速である可能性があります。

SQL

1with step1 as ( 2 select AA, BB, count(BB)as cnt 3 from AABB 4 group by AA, BB 5) , step2 as ( 6 select AA, BB, max(cnt) as max_cnt 7 from step1 8 group by AA, BB 9) 10select step1.* 11from step1 inner join step2 12 on step1.AA=step2.AA 13 and step1.BB=step2.BB 14 and step1.cnt=step2.max_cnt

今回は使用していませんが、分析関数(window関数)も使えるみたいなので、リファレンスの読み込みをお薦めします。

追記

質問者さんから回答されている内容のSQLは、以下と同じです。
GROUP BYの項目が同じであるなら、ネストさせる必要はありません。

SQL

1select AA, BB, count(*) from 2group by AA,BB 3order by AA, BB

投稿2020/02/05 01:33

編集2020/02/05 05:17
sazi

総合スコア25138

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

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

nkrmn_a

2020/02/05 04:12

回答してくださりありがとうございます。 自己解決してしまいましたが、withという関数(?)を初めて知りました。 とても便利そうですね。教えていただいてありがとうございます。今後使っていこうと思います。
guest

0

mysqlバージョン
yambejpさんのを修正

sql

1select AA,BB,count(*) as cnt from tbl as t1 2group by AA,BB 3having cnt=( 4select count(*) as cnt from tbl as t2 5where t2.AA=t1.AA 6group by AA,BB 7order by cnt desc limit 1 8);

投稿2020/02/04 11:29

hatena19

総合スコア33620

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

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

nkrmn_a

2020/02/05 04:26

回答していただきありがとうございます。 私の質問ミスのせいでご迷惑をおかけしました。お時間取らせてしまい申し訳ありません。 今後の参考させていただきます!
guest

0

mysqlバージョン

SQL

1select AA,BB,count(*) as cnt from tbl 2group by AA,BB 3having cnt=( 4select count(*) as cnt from tbl as t1 5group by AA,BB 6order by cnt desc limit 1 7);

投稿2020/02/04 11:11

yambejp

総合スコア114572

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

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

nkrmn_a

2020/02/05 04:21

回答していただきありがとうございます。 私の質問ミスのせいでご迷惑をおかけしました。お時間取らせてしまい申し訳ありません。
guest

0

美しさは兎も角、一応できている様です。Postgresqlで書いていますのはご容赦ください。

sql

1select t1.AA, t1.BB, t1.CC from 2 (select AA, BB, count(*) CC from tbl1 3 group by AA, BB) t1, 4 (select AA, max(CC) CC from 5 (select AA, BB, count(*) CC from tbl1 6 group by AA, BB) t3 7 group by AA) t2 8where t1.AA=t2.AA and t1.CC=t2.CC

投稿2020/02/04 09:35

編集2020/02/04 09:56
amura

総合スコア333

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

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

nkrmn_a

2020/02/05 04:15

回答していただきありがとうございます。 私の質問ミスのせいで期待通りの動作ではありませんでしたが、新しい書き方を知ることができ とてもありがたいです。Postgresqlも使う機会がありそうなので、こちら他でも参考にさせていただきます。
guest

0

自己解決

たいへん申し訳ないのですが、一つ見落としていたカラムを発見しました。
そもそもの考え方が異なっており、AAとBBとは別のCC(仮)もセットで一意のものとなっていました。

sql

1select AA, BB, max(cnt) from 2 (select AA, BB, count(*) as cnt from 3  (select AA, CC, BB from TABLE) 4 group by AA,BB 5) 6group by AA,BB 7order by AA

早とちりで色々とミスが発覚しているので、解決済から下げさせていただきました。
ご迷惑をおかけして申し訳ありません。

(追記)

どうやらSAP hanaのSQL動作が普通のものとは異なっていたようです。

実際にSAPhanaで実行したかったSQLはポスグレなどだとほんの数行で終わるようです。
私の環境ではそうはいかなかったので、解決した方法を記載しておきます。
上に書いてあるCCも使用しました。
SAPhanaを使用している方は参考にしてください(長いです)。

SQL(hana)

1WITH 2 tb AS( 3  SELECT 4    AA, BB, count(*) AS cnt 5  FROM ( 6   SELECT 7    AA, BB, CC 8   FROM 9    TABLE 10  ) 11  GROUP BY 12   AA, BB 13 ), 14 cntTb AS( 15  SELECT 16   AA, max(cnt) AS maxcnt 17  FROM 18   tb 19  GROUP BY 20   AA 21 ) 22 23SELECT 24 cntTb.AA, 25 BB, 26 maxcnt 27FROM 28 cntTb 29INNER JOIN 30 tb 31 ON  cntTb.AA = tb.AA 32 AND cntTb.maxcnt = tb.cnt 33ORDER BY 3 DESC, 1, 2

投稿2020/02/05 04:10

編集2020/02/10 08:58
nkrmn_a

総合スコア27

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

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

sazi

2020/02/05 04:14

解決したSQLは以下と同義で、質問にも出てくるSQLですけど、それなのに解決したのですか? select AA, BB, count(*) from TABLE group by AA, BB
sazi

2020/02/05 04:18 編集

ああ、count(*)ではなかったという事ですね。 count(項目名)だと 項目の値がNullの場合はカウントされません。
nkrmn_a

2020/02/05 04:18

CCが入ることでAAとBBが一意のものになり、そうでないとレコード数を数えられなかったようです。 お答えいただいたのに申し訳ありません。
sazi

2020/02/05 04:21

distinct とかgroup byとかが無いと(select AA, CC, BB from TABLE)を経由しても何も変わりませんよ。 count(*)に変えたからじゃないですか?
nkrmn_a

2020/02/05 04:34

確認したところ、 select AA, BB, count(*) from TABLE group by AA, BB で実行しても期待通りの動作になりませんでした。(全てAA,BBが1つずつという結果でした) TABLEには他にも多くのカラムがあるのですが、なにか関係しているということでしょうか…。
nkrmn_a

2020/02/05 04:51 編集

大変申し訳ないのですが、SQL文を間違えておりました。 先程載せていたSQL文についてはsaziさんのおっしゃる通りでした。 次からしっかりと確認した上で載せるように心掛けます。 ご迷惑をおかけしてすみません…
sazi

2020/02/05 04:56

考えられる事としては、group byにAA,BB以外を設定した、あるいはselectの項目にAA,BB以外を設定した、ですね。 selectの項目はSAP HANAが、Mysqlのようにgroup by項目が指定されていなくてもエラーとせずに忖度する仕様でなければ考えられませんので、group byの項目に不要なものを設定したのだと思います。
sazi

2020/02/05 05:17 編集

SQLをコメントに書くと見辛いので、私の回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問