基于W_number的sql列移位

问题描述 投票:0回答:1

输入:

输出:

我想写一个通用的mysql查询,它可以将输入表转换为输出表 基本上值是根据 w_number 进行转移的

这些表只是示例,我需要一个可以将列最多移动 60 的查询。

我尝试构建一些逻辑以获得这样的查询,这似乎有效

    SELECT 
        w_number,
        CASE WHEN w_number = 1 THEN value_1
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_7
                     WHEN w_number = 3 THEN value_6
                     WHEN w_number = 4 THEN value_5
                     WHEN w_number = 5 THEN value_4
                     WHEN w_number = 6 THEN value_3
                     WHEN w_number = 7 THEN value_2
                     ELSE NULL END
             ELSE NULL END AS value_1,
        CASE WHEN w_number = 1 THEN value_2
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_1
                     WHEN w_number = 3 THEN value_7
                     WHEN w_number = 4 THEN value_6
                     WHEN w_number = 5 THEN value_5
                     WHEN w_number = 6 THEN value_4
                     WHEN w_number = 7 THEN value_3
                     ELSE NULL END
             ELSE NULL END AS value_2,
        CASE WHEN w_number = 1 THEN value_3
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_2
                     WHEN w_number = 3 THEN value_1
                     WHEN w_number = 4 THEN value_7
                     WHEN w_number = 5 THEN value_6
                     WHEN w_number = 6 THEN value_5
                     WHEN w_number = 7 THEN value_4
                     ELSE NULL END
             ELSE NULL END AS value_3,
        CASE WHEN w_number = 1 THEN value_4
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_3
                     WHEN w_number = 3 THEN value_2
                     WHEN w_number = 4 THEN value_1
                     WHEN w_number = 5 THEN value_7
                     WHEN w_number = 6 THEN value_6
                     WHEN w_number = 7 THEN value_5
                     ELSE NULL END
             ELSE NULL END AS value_4,
        CASE WHEN w_number = 1 THEN value_5
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_4
                     WHEN w_number = 3 THEN value_3
                     WHEN w_number = 4 THEN value_2
                     WHEN w_number = 5 THEN value_1
                     WHEN w_number = 6 THEN value_7
                     WHEN w_number = 7 THEN value_6
                     ELSE NULL END
             ELSE NULL END AS value_5,
        CASE WHEN w_number = 1 THEN value_6
             WHEN w_number > 1 AND w_number <= 7 THEN 
                CASE WHEN w_number = 2 THEN value_5
                     WHEN w_number = 3 THEN value_4
                     WHEN w_number = 4 THEN value_3
                     WHEN w_number = 5 THEN value_2
                     WHEN w_number = 6 THEN value_1
                     WHEN w_number = 7 THEN value_7
                     ELSE NULL END
             ELSE NULL END AS value_6,
        CASE WHEN w_number = 1 THEN value_7
             ELSE NULL END AS value_7
    FROM your_table_name
    ORDER BY w_number;
mysql
1个回答
0
投票

参见示例

select *
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+0)%7,']'))value_1
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+1)%7,']'))value_2
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+2)%7,']'))value_3
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+3)%7,']'))value_4
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+4)%7,']'))value_5
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+5)%7,']'))value_6
  ,JSON_EXTRACT(ar,concat('$[',(7-idx+6)%7,']'))value_7
--  ,(7-idx+0)%7 i1,(7-idx+1)%7 i2,(7-idx+2)%7 i3,(7-idx+3)%7 i4,(7-idx+4)%7 i5
--  ,(7-idx+5)%7 i6,(7-idx+6)%7 i7
from(
select id,w_number,json_array(value_1,value_2,value_3,value_4,value_5,value_6,value_7) ar
  ,w_number-1 idx
from test
)jsa

输出是

id w_number ar idx 值_1 值_2 值_3 值_4 值_5 值_6 值_7
1 5 [10, 20, 空, 空, 空, 空, 空] 4 10 20
2 4 [空、50、60、70、空、空、空] 3 50 60 70
3 2 [空,90,空,110,空,空,空] 1 90 110
4 2 [空、空、30、40、空、空、空] 1 30 40
5 1 [50,60,70,90,空,空,空] 0 50 60 70 90
6 3 [90, 100, 110, 120, 空, 空, 空] 2 90 100 110 120
7 5 [空、50、60、70、空、空、空] 4 70 50 60
8 1 [1,2,3,4,5,6,7] 0 1 2 3 4 5 6 7
9 2 [1,2,3,4,5,6,7] 1 7 1 2 3 4 5 6
10 3 [1,2,3,4,5,6,7] 2 6 7 1 2 3 4 5
11 4 [1,2,3,4,5,6,7] 3 5 6 7 1 2 3 4
12 5 [1,2,3,4,5,6,7] 4 4 5 6 7 1 2 3
13 6 [1,2,3,4,5,6,7] 5 3 4 5 6 7 1 2
14 7 [1,2,3,4,5,6,7] 6 2 3 4 5 6 7 1
15 8 [1,2,3,4,5,6,7] 7 1 2 3 4 5 6 7
© www.soinside.com 2019 - 2024. All rights reserved.