表:ログ
+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| 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
知識ポイント:
ユーザー変数とループ