- 主キーが定義されていないため、
creation_date
にデータが順番に入力されると想定しています。 およびladder_level
。 覚えておいてください そのデータはMySQLに順序付けられていない方法で保存されます。 - 最初に、サブ選択クエリを使用して、必要な順序でデータを取得する必要があります(前の手順で強調表示されているように)。
Order By
は注目に値しますSelect
の後に実行されます 句;したがって、最初にデータを並べ替えてから、結果セットを派生テーブル 。 - ここで、ユーザーの助けを借ります-定義された変数
(セッションレベルの永続的でアクセス可能)。別の派生テーブル
user_init_vars
、初期化します。 Select
で 句では、現在の行の値を前の行の値と比較します。比較後、変数値を現在の行の値に設定します。これは、PHP、C ++、Javaなどの他のプログラミング言語で使用されているループ手法と考えることができます。-
Case .. When
式は、比較、およびladder_change
の決定に使用されます 値。
クエリ#1
SELECT
dt.ID,
CASE WHEN DATE(@rd) <> DATE(dt.record_date) AND
dt.ladder_level > @ll
THEN 1
ELSE 0
END AS ladder_change,
@rd := dt.record_date AS record_date,
@ll := dt.ladder_level AS ladder_level
FROM (SELECT ID, record_date, ladder_level
FROM conv_example
ORDER BY ID, record_date, ladder_level) AS dt
CROSS JOIN (SELECT @rd := '',
@ll := '') AS user_init_vars;
| ID | ladder_change | record_date | ladder_level |
| ----- | ------------- | ------------------- | ------------ |
| 324 | 0 | 2016-09-15 00:00:00 | a |
| 324 | 0 | 2016-09-15 00:00:00 | b |
| 324 | 0 | 2017-04-07 00:00:00 | b |
| 324 | 0 | 2017-04-07 00:00:00 | c1 |
| 324 | 0 | 2018-09-08 00:00:00 | c1 |
| 324 | 0 | 2018-09-08 00:00:00 | e |
| 1234 | 0 | 2013-04-03 00:00:00 | |
| 1234 | 0 | 2014-07-03 00:00:00 | a |
| 1234 | 1 | 2015-04-01 00:00:00 | b |
| 1234 | 1 | 2016-09-15 00:00:00 | d |
| 1234 | 0 | 2017-02-04 00:00:00 | b |
| 1234 | 0 | 2017-04-03 00:00:00 | b |
| 1234 | 1 | 2017-04-07 00:00:00 | c1 |
| 1234 | 1 | 2018-09-08 00:00:00 | e |
| 31431 | 0 | 2013-04-03 00:00:00 | |
| 31431 | 0 | 2014-07-03 00:00:00 | a |
| 31431 | 1 | 2017-04-07 00:00:00 | c1 |
| 31431 | 1 | 2018-09-08 00:00:00 | e |