- Aangezien er geen primaire sleutel is gedefinieerd, ga ik ervan uit dat de gegevens in de juiste volgorde worden ingevoerd op
creation_date
enladder_level
. Onthoud die gegevens worden ongeordend opgeslagen in MySQL. - Ten eerste moeten we een subselectiequery gebruiken om de gegevens in de vereiste volgorde te krijgen (zoals aangegeven in de vorige stap). Het is opmerkelijk dat
Order By
wordt uitgevoerd naSelect
clausule; dus we moeten eerst de gegevens sorteren en vervolgens de resultatenset gebruiken als een Afgeleide tabel . - Nu nemen we de hulp in van Gebruiker- gedefinieerde variabelen
(persistent en toegankelijk op sessieniveau). In een andere afgeleide tabel
user_init_vars
, we initialiseren ze. - In de
Select
clausule, vergelijken we de waarde van de huidige rij met de waarde van de vorige rij. Na vergelijking stellen we de variabelewaarde in op de waarde van de huidige rij. Je kunt het zien als looping-techniek, die we gebruiken in andere programmeertalen zoals PHP, C++, Java enz. Case .. When
uitdrukkingen worden gebruikt voor vergelijking en het bepalen van deladder_change
waarde.
Vraag #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 |