gpt4 book ai didi

MySql 选择动态行值作为列名

转载 作者:行者123 更新时间:2023-11-29 06:35:05 25 4
gpt4 key购买 nike

这是我给定的表格:

+---------+------------+-------------------+--------------------------+---------------+---------------+
| exec_id | project_id | flow_id | job_id | start_time | end_time |
+---------+------------+-------------------+--------------------------+---------------+---------------+
| 10919 | 16 | my_flow_cleanup | init | 1408480308611 | 1408480308686 |
| 10919 | 16 | my_flow_cleanup | job_id_1 | 1408480309212 | 1408480309426 |
| 10919 | 16 | my_flow_cleanup | job_id_2 | 1408480308721 | 1408480308776 |
| 10919 | 16 | my_flow_cleanup | job_id_3 | 1408480308827 | 1408480309171 |
+---------+------------+-------------------+--------------------------+---------------+---------------+

我想实现这样的选择:

exec_id     init_start            init_end            job_id_1_start       job_id_1_end       job_id_2_start        job_id_2_end        job_id_3_start      job_id_3_end
10919 1408480308611 1408480308686 1408480309212 1408480309426 1408480308721 1408480308776 1408480308827 1408480309171

我在这上面花了2天多的时间,收效甚微。 This question帮助了我,但不完全。如您所见,另一个问题涉及获取 2 列并将它们转换为 2 行。但我必须将 3 列转换为 2 行。

谁能帮我解决这个问题?在 MySQL 中甚至可能吗?

编辑 1

感谢 Khalid Junaid 的回答,它解决了我的问题。我必须再做一个修改。我必须按 start_time 按升序对选定的列进行排序。

例如:

+---------+------------+-------------------+----------+---------------+---------------+
| exec_id | project_id | flow_id | job_id | start_time | end_time |
+---------+------------+-------------------+----------+---------------+---------------+
| 10919 | 16 | my_flow_cleanup | init | 10 | 15 |
| 10919 | 16 | my_flow_cleanup | job_id_1 | 30 | 40 |
| 10919 | 16 | my_flow_cleanup | job_id_2 | 40 | 50 |
| 10919 | 16 | my_flow_cleanup | job_id_3 | 20 | 25 |
+---------+------------+-------------------+----------+---------------+---------------+

当前查询将返回:

exec_id     init_start            init_end            job_id_1_start       job_id_1_end       job_id_2_start        job_id_2_end        job_id_3_start      job_id_3_end
10919 10 15 30 40 40 50 20 25

我需要:

exec_id     init_start            init_end            job_id_3_start       job_id_3_end       job_id_1_start        job_id_1_end        job_id_2_start      job_id_2_end
10919 10 15 20 25 30 40 40 50

请注意,列的顺序现在已根据 start_time 更改。

我试着用临时表 View 来做这件事,我认为这会很容易。不幸的是,我没有创建表/创建 View 的权限。有没有办法在没有临时表和 View 的情况下实现这一目标?

最佳答案

从引用问题中使用 group_concat 的方法,您可以这样做,但请注意一件事,因为每个 exec_id 组的作业 ID 会增加,然后是 group_concat 由于要连接的默认长度为 1024 个字符,因此该方法不是最佳方法,对于您的动态列,这肯定会超过该限制,但可以增加此限制,如 documentation 中所述

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN job_id = ''',
job_id,
''' THEN start_time END) `',
job_id,
'_start`',
',',
'MAX(CASE WHEN job_id = ''',
job_id,
''' THEN end_time END) `',
job_id,
'_end`'
)

)
INTO @sql
FROM t;

SET @sql = CONCAT('SELECT exec_id, ', @sql, '
FROM t
GROUP BY exec_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Fiddle Demo

关于MySql 选择动态行值作为列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com