LeetCode-1285。デジタル(中)の連続の始まりと終わりを探すユーザー変数とループ

表:ログ

+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| LOG_ID | int型|
+ --------------- + --------- +
上記のIDは、テーブルの主キーです。
テーブルの各行は、ログテーブル内のIDを含んでいます。
 

その後、IDの一部は、ログテーブルから削除されます。デジタルデジタルログテーブルの連続区間の開始と終了を取得するために、SQLクエリを記述します。

START_IDソートに従い、ルックアップテーブル。

クエリの形式は、次の例の結果:

ログ表:
+ ------------ +
| LOG_ID |
+ ------------ +
| 1 |
| 2 |
| 3 |
| 7 |
| 8 |
| 10 |
+ ------------ +

結果表:
+ ------------ + ------------ +
| START_ID | END_ID |
+ ------------ + -------------- +
| 1 | 3 |
| 7 | 8 |
| 10 | 10 |
+ ----------------------- + ----- + ---------
すべてのセクションログテーブルを含む結果テーブル。
1から表3に。
いないテーブル内の4〜6から。
7テーブル内の8から。
表中の9ません。
表中の10。

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/find-the-start-and-end-number-of-continuous-ranges
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

モデレーション:からのIDの後に、いくつか  Logs 削除リスト。取得するSQLクエリを書く  Logs のテーブルの連続でデジタル数字の開始と終了を。

思考:クエリ練習、トラバースに必要、

問題解決:

ID @ NUM @ 2つの変数を定義します。連続した記録マークのストアLOG_ID、@ NUM LOG_IDに使用@Id。

SELECT
	log_id,
	CASE WHEN @id = log_id - 1 
        THEN @num := @num
        ELSE @num := @num + 1
        END num,
        @id := log_id
FROM LOGS,
(SELECT @num := 0, @id := NULL) a

上記の結果を得た後、START_IDの最小値を有するパケットのNUMフィールドは、end_idのLOG_ID最大LOG_ID。

SELECT
    min(log_id) start_id,
    max(log_id) end_id
FROM
	(
        SELECT
		log_id,
		CASE WHEN @id = log_id - 1 
                THEN @num := @num
		ELSE @num := @num + 1
		END num,
		@id := log_id
	FROM LOGS,
            (SELECT @num := 0, @id := NULL) a
	) x
GROUP BY
	num

 知識ポイント:

ユーザー変数とループ

公開された144元の記事 ウォンの賞賛2 ビュー5737

おすすめ

転載: blog.csdn.net/Hello_JavaScript/article/details/104778400