- Ponieważ nie zdefiniowano klucza podstawowego, zakładam, że dane są wprowadzane w kolejności sekwencyjnej w dniu
creation_date
iladder_level
. Pamiętaj że dane są przechowywane w nieuporządkowany sposób w MySQL. - Po pierwsze, musimy użyć zapytania podwyboru, aby uzyskać dane w wymaganej kolejności (jak zaznaczono w poprzednim kroku). Warto zauważyć, że
Order By
jest wykonywane poSelect
klauzula; więc musimy najpierw posortować dane, a następnie użyć zestawu wyników jako Tabela pochodna . - Teraz skorzystamy z pomocy User- zdefiniowane zmienne
(trwałe i dostępne na poziomie sesji). W innej tabeli pochodnej
user_init_vars
, inicjujemy je. - W
Select
klauzula, porównujemy wartość bieżącego wiersza z wartością poprzedniego wiersza. Po porównaniu ustawiamy wartość zmiennej na wartość bieżącego wiersza. Możesz myśleć o tym jako o technice pętli, której używamy w innych językach programowania, takich jak PHP, C++, Java itp. Case .. When
wyrażenia są używane do porównywania i określanialadder_change
wartość.
Zapytanie nr 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 |