sql >> Database >  >> RDS >> Mysql

SQL Return 1,0 in nieuwe variabele op basis van case when-instructie die verwijst naar meerdere andere variabelen

  • Aangezien er geen primaire sleutel is gedefinieerd, ga ik ervan uit dat de gegevens in de juiste volgorde worden ingevoerd op creation_date en ladder_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 na Select 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 de ladder_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            |

Bekijken op DB Fiddle




  1. Draaien op meerdere kolommen met Tablefunc

  2. LAST_INSERT_ID() retourneert altijd 0 (RMySQL) - afzonderlijk verbindingsprobleem

  3. Een zeer beschikbare Nextcloud implementeren met MySQL Galera Cluster en GlusterFS

  4. Hoe onverwachte groei van SQL Server-database TempDB te detecteren en te voorkomen?