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はスネークゲームを実装する

推薦する

js を使用して数字推測ゲームを実装する

先週、先生が私に数字当てゲームをするちょっとした宿題を出しました。とても面白いと思ったので、適当に書...

JS 関数とコンストラクタを簡単に理解する

目次1. 概要1.1 Functionコンストラクタを使用して関数を作成する1.2 機能と目的2. ...

Docker MQTT のインストールと使用のチュートリアル

MQTT の紹介MQTT (Message Queuing Telemetry Transport)...

2列の水平タイムラインを実装するためのVueサンプルコード

目次1.コンポーネントtimelineH.vueを実装する2. コンポーネントの呼び出しこの記事では...

JavaScript におけるイベント バブリング メカニズムの詳細な分析

バブリングとは何ですか? DOM イベント フローには、イベント キャプチャ ステージ、ターゲット ...

ES9の新機能の詳細な説明: 非同期反復

目次非同期トラバーサル非同期反復可能トラバーサル非同期反復生成非同期メソッドと非同期ジェネレーター非...

MySQL 8.0.13 のダウンロードとインストールのチュートリアル(画像とテキスト付き)

MySQL は最もよく使用されるデータベースです。詳しく知るには、コンピュータにインストールする必...

CSS3に基づいてiPhoneを描く

結果:実装コードhtml <div class='iphone'> &l...

JavaScript は大容量ファイルのアップロード処理を実装します

数十 MB 程度の小さいものから 1G 以上の大きいものまで、ビデオ ファイルなどのファイルのアップ...

clearfixとclearの例

この記事では、CSS を理解し始めたばかりの人を対象に、主に HTML で clearfix と c...

JavaScript の find() メソッドと filter() メソッドの違いのまとめ

目次序文JavaScript find() メソッドJavaScript filter() メソッド...

MySQL 5.7 生成列の使用例の分析

この記事では、例を使用して、MySQL 5.7 で生成された列の使用方法を説明します。ご参考までに、...

LINUX ポートが占有されているかどうかを確認します

ポートが占有されているかどうかは、これまで一度もわかりませんでした。多くの人に尋ねて、ようやくわかり...

Linux でシェル スクリプトを使用して jar パッケージ プロジェクトを展開するための完全な手順

1. JDKをインストールする コンピュータの動作桁を確認します。 uname -ar 2017 x...

Linux システムで jmeter を実行し、ローカル メモリを最適化する方法の詳細な説明

1. Linuxシステムにクロスシステムファイル転送ツールをインストールするルートユーザーのルートデ...