該当カラムの最大値をもとに効率的にデータを取得します
関連する列の最大値に基づいて特定の列の値を取得し、3 番目の列でグループ化する必要があるシナリオでは、SQL が最適化されたソリューションを提供します。 KEY、NUM、VAL 列のデータが含まれる次のテーブルについて考えてみましょう:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
目標は、このデータから次の結果を取得することです:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
質問で提供されたクエリではこの結果が得られますが、row_number()
を使用したより洗練された方法があります。
<code class="language-sql">select key, val from ( select t.*, row_number() over (partition by key order by num desc) as seqnum from table_name t ) t where seqnum = 1;</code>
このクエリは、KEY 列に基づいて行を効率的に分割し、各パーティション内で行番号を降順 seqnum
に割り当てます。 seqnum
が 1 に等しい行を選択すると、目的の結果が得られ、目的のグループ化が保持されます。
このメソッドは、キーごとに常に 1 行を返すのに対し、元のクエリは複数の行を返す可能性があるという点で、元のクエリとは少し異なることに注意してください。この動作が必要な場合は、rank()
の代わりに dense_rank()
または row_number()
を使用できます。
以上がSQL で関連列の最大値に基づいて値を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。