继续我的 previous question :我必须使用动态行值作为列,但列的顺序需要特定。如果您查看以下示例,我必须按 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 |
+---------+------------+-------------------+----------+---------------+---------------+
来自上一个问题:
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;
以上查询将返回以下结果:
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
函数中添加 ORDER BY start_time ASC
来实现此目的
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`'
)
ORDER BY start_time ASC
)
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/25690485/