LeetCode の SQL 実装 (178. スコアランキング)

LeetCode の SQL 実装 (178. スコアランキング)

[LeetCode] 178.ランクスコア

スコアをランク付けする SQL クエリを記述します。2 つのスコアが同点の場合、両方のランキングは同じになります。同点の後、次のランキング番号は次の連続する整数値になることに注意してください。つまり、ランク間に「穴」があってはなりません。

+----+-------+
| ID | スコア |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+

たとえば、上記のスコア テーブルの場合、クエリによって次のレポートが生成されます (最高スコア順)。

+-------+------+
| スコア | 順位 |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+

この質問では、スコア表が与えられ、スコアを並べ替えるように求められます。 要件は、同じスコアが同じランクにあり、次のスコアが次の連続したランクにあり、間に空白の数字があってはならないことです。 私はこの質問をスティーブンの投稿に完全に従って書きました。 私は偉大な神を崇拝しています... 偉大な神は4つの方法を要約したので、1つずつ崇拝して学びましょう。 まず、最初の解決策を見てください。 問題を解決するアイデアは、表内の異なるスコアが各スコア以上であるかどうかを調べ、降順に並べることです。 次のコードを参照してください。

解決策1:

SELECTスコア、 
(SELECT COUNT(DISTINCT Score) FROM Scores WHERE Score >= s.Score) ランク 
FROM スコア s ORDER BY スコア DESC;

解決方法は上記と同じですが、書き方が少し異なります。

解決策2:

SELECTスコア、
(SELECT COUNT(*) FROM (SELECT DISTINCT Score s FROM Scores) t WHERE s >= Score) ランク
スコアからスコアの順に並べ替え、スコアの順に降順で並べ替えます。

次のソリューションでは、内部結合を使用します。結合は、Inner Join の略語です。これは、それ自体を内部結合します。条件は、右側のテーブルのスコアが左側のテーブルのスコア以上であることです。次に、グループがグループ化され、スコアの降順で並べられます。これは非常に巧妙なソリューションです。

解決策3:

SELECT s.Score、COUNT(DISTINCT t.Score) ランク
Scores s から Scores t を結合し、 s.Score <= t.Score を ON します。
GROUP BY s.Id ORDER BY s.Score DESC;

次のソリューションは、上記の 3 つのソリューションとは異なります。ここでは 2 つの変数が使用されています。使用する場合、変数の前に @ を追加する必要があります。ここでの := は割り当てを意味します。前に Set キーワードがある場合は、= 記号を使用して値を直接割り当てることができます。そうでない場合は、:= を使用して値を割り当てる必要があります。rank と pre という 2 つの変数があり、rank は現在のランキングを表し、pre は前のスコアを表します。次のコードの <> は等しくないことを意味します。左辺と右辺が等しくない場合は、true または 1 が返されます。等しい場合は、false または 0 が返されます。ランクを0、プレを-1に初期化し、スコアを降順に並べます。スコア4の場合、プレには4が割り当てられますが、これは前のプレ値-1とは異なります。そのため、ランクは1増加し、スコア4のランクは1になります。次のスコアはまだ4なので、プレには4が割り当てられますが、これは前の4と同じなので、ランクは0増加し、このスコア4のランクも1になります。このようにして、すべてのスコアのランクを計算できます。

解決策4:

SELECTスコア、
@rank := @rank + (@pre <> (@pre := スコア)) ランク
スコアから、(SELECT @rank := 0, @pre := -1) INIT 
ORDER BY スコア DESC;

参考文献:

https://leetcode.com/discuss/40116/simple-short-fast

これで、LeetCode (178. スコアランキング) の SQL 実装に関するこの記事は終了です。より関連性の高い SQL 実装スコアランキングコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • LeetCode の SQL 実装 (184. 部門内で最も高い給与)
  • LeetCode の SQL 実装 (183. 注文をしたことがない顧客)
  • LeetCode の SQL 実装 (182. 重複するメールボックス)
  • LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)
  • SQLはLeetCodeを実装します(180.連続した数字)
  • LeetCode の SQL 実装 (177. 給与が N 番目に高い)
  • SQL実装 LeetCode (176. 2番目に高い給与)
  • SQL 実装 LeetCode (185. 部門内で最も給与の高い上位 3 名)

<<:  中国語フォントの英語名まとめ

>>:  JSはスネークゲームを実装する

推薦する

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Linuxのファイルとフォルダの権限を操作する方法

Linux のファイル権限まず、現在のディレクトリ内のファイルの内容を確認しましょう。 ls -l ...

Vue+Openlayer で select を使用して要素を選択する実装コード

効果画像: 実装コード: <テンプレート> <div id="map&q...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

MySQL マスタースレーブ同期、トランザクションロールバックの実装原理

ビンログBinLog は、データベース テーブル構造の変更 (テーブルの作成、変更など) とテーブル...

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

MySQL 5.7.18 バージョンの無料インストール構成チュートリアル

MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...

この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

イベント委任を使用してメッセージ ボード機能を実装します。 <!DOCTYPE html>...

MySQL の自動インクリメント主キーが連続していないのはなぜですか?

目次1. はじめに2. 自己増分ストレージの説明3つの自己付加価値修正メカニズム4. 自己評価を修正...

MySQL はどのようにしてマスターとスレーブの同期を実現するのでしょうか?

マスタースレーブ同期 (マスタースレーブレプリケーションとも呼ばれる) は、マスタースレーブデータの...

Docker で PostgreSQL を実行し、いくつかの接続ツールを推奨する

1 はじめに PostgreSQL は、非常に充実した機能を備えたフリーソフトウェアのオブジェクトリ...

Reactはグローバル箇条書きボックスメソッドをカプセル化します

この記事の例では、Reactカプセル化グローバルポップアップボックスの具体的なコードを参考までに共有...

Docker マイクロサービス用の ETCD クラスターの構築に関する詳細なチュートリアル

目次etcdの機能etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。今回構築...

スライドボタン効果を実現するネイティブJS

Jsで作ったスライドボタンの具体的なコードは参考までに。具体的な内容は以下のとおりですまずエフェク...