[解決済み] SQLでカラムに最大値を持つ行のみを選択する [重複]。
質問
ドキュメント用にこんな表があります(簡易版はこちら)。
idごとに1行、最大revだけを選択するには?
上記のデータでは、結果には2つの行が含まれるはずです。
[1, 3, ...]
と
[2, 1, ..]
. 私は
MySQL
.
現在、私はチェックを
while
ループで、結果セットから古いレヴを検出して上書きしています。しかし、これは結果を得るための唯一の方法なのでしょうか?また
SQL
の解決策になりますか?
どのように解決するのですか?
一見すると...
必要なのは
GROUP BY
節に
MAX
のアグリゲート関数を使用します。
SELECT id, MAX(rev)
FROM YourTable
GROUP BY id
そんな単純な話じゃないだろう?
今気づいたのですが
content
カラムもあります。
これはSQLで非常によくある質問です。あるグループ識別子ごとに、ある列の最大値を持つ行のデータ全体を見つけることです。私はキャリアの中でこれをよく耳にしました。実際、今の仕事の技術面接で答えた質問の一つでもあります。
このような質問はよくあることなので、Stack Overflowコミュニティでは、このような質問に対応するためのタグを作成したほどです。 最大のNパーグループ .
基本的に、その問題を解決するために2つのアプローチがあります。
シンプルな結合
group-identifier, max-value-in-group
サブクエリ
この方法では、まず
group-identifier, max-value-in-group
(上記で解決済み) をサブクエリで作成します。次に、テーブルをサブクエリに結合します。
group-identifier
と
max-value-in-group
:
SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
SELECT id, MAX(rev) rev
FROM YourTable
GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev
自己との左結合、結合条件とフィルタの調整
この方法では、テーブルを自分自身と左結合します。等号は
group-identifier
. そして、2つのスマートな動き。
- 2つ目の結合条件は、左辺の値が右辺の値より小さいことです。
-
ステップ 1 を実行すると、実際に最大値を持つ行は、以下のようになります。
NULL
が右側に表示されます(これはLEFT JOIN
覚えていますか?) そして、結合した結果をフィルタリングして、右辺がNULL
.
で終わってしまうんですね。
SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;
まとめ
どちらのアプローチも全く同じ結果をもたらします。
を持つ2つの行がある場合
max-value-in-group
に対して
group-identifier
の場合、どちらの方法でも、両方の行が結果に含まれることになります。
どちらのアプローチもSQL ANSI互換なので、お使いのRDBMSの種類に関係なく動作します。
また、どちらのアプローチもパフォーマンスに優れていますが、お客様の使用状況(RDBMS、DB構造、インデックスなど)により異なる可能性があります。だから、どちらかのアプローチを選ぶときは ベンチマーク . そして、あなたにとって最も理にかなっているものを選ぶようにしてください。
関連
-
群関数解の無効な使用
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] MYSQLでMAX(列の値)、PARTITIONで別の列で行を選択するにはどうすればよいですか?
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
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におけるorder byの使用方法の詳細
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
Mysqlのソート機能の詳細
-
[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
-
[解決済み] 1つのSQLクエリで複数のカウントを取得する方法は?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL