MySQL CTE - возможно ли выполнять итерации по диапазону чисел? - PullRequest
1 голос
/ 25 октября 2019

Мне любопытно, возможно ли выполнить аналогичный запрос с использованием CTE (значения «id» могут отличаться, не обязательно в последовательности)

SELECT
      elt((@mxId := if(@mxId + 1 <= 3, @mxId + 1, 1)), 5, 10, 22, 33) val,
      id
   FROM my_table
   INNER JOIN (SELECT @mxId := 0) tmp;

Ожидаемый результат:

 val | id
-----+----
5    | 1
10   | 2
22   | 3
5    | 4
10   | 5
22   | 6
5    | 7
10   | 8
22   | 9
5    | 10
10   | 11
22   | 12
5    | 13
10   | 14
22   | 15
5    | 16
10   | 17
22   | 18
5    | 19
10   | 20

Ответы [ 2 ]

0 голосов
/ 25 октября 2019
row_number() OVER ()

это волшебство - Большое спасибо

0 голосов
/ 25 октября 2019
with my_table_numbered as (
  select ((row_number() over ())-1)%3 as rn_mod, id from my_table
)
select elt(rn_mod+1, 5, 10, 22, 33) as val, id 
from my_table_numbered;

Вывод:

+------+----+
| val  | id |
+------+----+
| 5    |  1 |
| 10   |  2 |
| 22   |  3 |
| 5    |  4 |
| 10   |  6 |
| 22   |  7 |
| 5    |  8 |
| 10   |  9 |
| 22   | 13 |
| 5    | 14 |
| 10   | 15 |
| 22   | 16 |
+------+----+

Вы должны указать ORDER BY в CTE, чтобы получить значимую и надежную нумерацию строк, но у вас ее не было в запросе в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...