- Dato che non è stata definita una chiave primaria, presumo che i dati siano inseriti in ordine sequenziale su
creation_date
eladder_level
. Ricorda quei dati sono archiviati in modo non ordinato in MySQL. - In primo luogo, dobbiamo utilizzare una query di selezione secondaria per ottenere i dati nell'ordine richiesto (come evidenziato nel passaggio precedente). È interessante notare che
Order By
viene eseguito dopoSelect
clausola; quindi dovremo prima ordinare i dati e quindi utilizzare il set di risultati come Tabella derivata . - Ora ci avvarremo dell'aiuto di User- variabili definite
(persistente e accessibile a livello di sessione). In un'altra tabella derivata
user_init_vars
, li inizializziamo. - Nel
Select
clausola, confrontiamo il valore della riga corrente con il valore della riga precedente. Dopo il confronto, impostiamo il valore della variabile sul valore della riga corrente. Puoi pensarla come una tecnica di loop, che usiamo in altri linguaggi di programmazione come PHP, C++, Java ecc. Case .. When
le espressioni vengono utilizzate per il confronto e per determinare illadder_change
valore.
Richiesta n. 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 |