[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
2021-12-31 02:24:38
質問事項
次のようなテーブルがあります。 呼び出し元 'makerar'
cname | wmname | avg
--------+-------------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
そして、各cnameの最大avgを選択したい。
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
が、エラーになります。
ERROR: column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
というわけで、こんな感じです。
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
しかし、これでは意図した結果が得られず、以下のような不正な出力が表示されます。
cname | wmname | max
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
実際の結果は次のとおりです。
cname | wmname | max
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | usopp | 5.0000000000000000
注:このテーブルは、以前の操作で作成されたVIEWです。
どのように解決するのですか?
はい、これはよくある集計の問題です。以前は
SQL3 (1999年)
の場合、選択されたフィールドは
GROUP BY
節[*]を使用します。
この問題を回避するには、サブクエリで集約を計算し、それを自分自身と結合して、表示する必要のある追加の列を取得する必要があります。
SELECT m.cname, m.wmname, t.mx
FROM (
SELECT cname, MAX(avg) AS mx
FROM makerar
GROUP BY cname
) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg
;
cname | wmname | mx
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | usopp | 5.0000000000000000
しかし、ウィンドウ関数を使うこともでき、その方がシンプルに見えます。
SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar
;
この方法の唯一の点は、すべてのレコードを表示することです(ウィンドウ関数はグループ化しません)。しかし、正しい(つまり、最大で
cname
レベル)
MAX
をそれぞれの行の国名にするのは、あなた次第です。
cname | wmname | mx
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 5.0000000000000000
spain | usopp | 5.0000000000000000
解決策は、間違いなく、よりエレガントではない、唯一の
(cname, wmname)
のタプルは、最大値にマッチします。
SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */
m.cname, m.wmname, t.avg AS mx
FROM (
SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY avg DESC) AS rn
FROM makerar
) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1
;
cname | wmname | mx
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | usopp | 5.0000000000000000
[*]: 興味深いことに、グループ化されていないフィールドを選択することは仕様上可能ですが、主要なエンジンはそれを好まないようです。OracleとSQLServerはこれをまったく許可していません。Mysqlは以前はデフォルトで許可していましたが、5.7以降では管理者がこのオプションを有効にする必要があります(
ONLY_FULL_GROUP_BY
この機能をサポートするために、サーバーの設定に手動で追加してください。
関連
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み】マルチパート識別子をバインドできない
-
SQLException。オペランドは1列でなければなりません。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
Mysqlの使用中に発生したエラーの一部
-
[解決済み] Mysqlでidを使用してテーブルから多くの行を削除する
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
MySQLインストールチュートリアル(Windows用)詳細
-
MySQLで正規表現を使う 詳細
-
MySQLデータベースで数百万件のデータを10秒間で挿入
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
sql エラーを解決する オペランドには1つの列が含まれている必要があります。
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
PostMan レポート エラー: 接続 ECONNREFUSED 127.0.0.1:port number
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?