sql >> Databasteknik >  >> RDS >> Mysql

SQL Returnerar 1,0 i ny variabel baserat på fall när uttalande hänvisar till flera andra variabler

  • Eftersom det inte finns någon definierad primärnyckel antar jag att data läggs in i sekventiell ordning på creation_date och ladder_level . Kom ihåg att data lagras på oordnat sätt i MySQL.
  • För det första måste vi använda en undervalsfråga för att få data i önskad ordning (som markerats i föregående steg). Det är anmärkningsvärt att Order By exekveras efter Select klausul; så vi måste först få uppgifterna sorterade och sedan använda resultatuppsättningen som en Härledd tabell .
  • Nu tar vi hjälp av Användar- definierade variabler (beständig och tillgänglig på sessionsnivå). I en annan härledd tabell user_init_vars , initialiserar vi dem.
  • I Select sats, jämför vi den aktuella radens värde med föregående radvärde. Efter jämförelse ställer vi in ​​variabelvärdet till den aktuella radens värde. Du kan se det som looping-teknik, som vi använder i andra programmeringsspråk som PHP, C++, Java etc.
  • Case .. When uttryck används för jämförelse och bestämning av ladder_change värde.

Fråga #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            |

Visa på DB Fiddle




  1. Uppskjutningsbara begränsningar i SQL Server

  2. Hur du komprimerar din databas så att den går snabbare

  3. Hur bygger man dynamisk fråga genom att binda parametrar i node.js-sql?

  4. Hur uppdaterar man en tabell automatiskt när en annan tabell uppdateras på en annan mysql-server?