如何将列拆分为按日期排序的多个列

时间:2014-11-13 13:09:26

标签: mysql datetime split

我在尝试以适当的格式获取数据库的数据时遇到了很多问题。 我正在寻找按天打印数据库输出的方法。

我的数据库有两列,一列的格式为timestamp,格式为YYYY-MM-DD H:M,另一列的格式与速度相关。

我需要按天拆分速度数据。

或多或少,我的数据库是这样的(每天有288个数据):

 Timestamp          |   Speed

2014-05-01 00:03:00 |   328.71    
2014-05-01 00:18:00 |   331.31    
2014-05-01 00:33:00 |   193.83        
2014-05-02 00:03:00 |   321.21    
2014-05-02 00:18:00 |   290.39    
2014-05-02 00:33:00 |   283.43

我正在寻找的是:

Hour    | 2014-05-01 | 2014-05-02

00:03:00 | 328.71    | 321.21     
00:18:00 | 331.31    | 290.39    
00:33:00 | 193.83    | 283.43

首先,我试图以静态的方式做,但是当我得到它时,我会动态。

我所提出的查询是

SELECT 
(CASE WHEN Timestamp>='2014-05-01' AND Timestamp<='2014-05-03' 
    THEN date_format(Timestamp,'%H:%i') ELSE 0 END) AS 'Hour', 
(CASE WHEN Timestamp>='2014-05-01' AND Timestamp<='2014-05-02' 
    THEN speed ELSE 0 END) AS '2014-05-01', 
(CASE WHEN Timestamp>='2014-05-02' AND Timestamp<='2014-05-03' 
    THEN velocidad ELSE 0 END) AS '2014-05-02' 
FROM `db_speed` 
WHERE Timestamp>='2014-05-01' AND Timestamp<='2014-05-10

通过这个查询,我得到一个这样的结构:

Hour     | 2014-05-01 | 2014-05-02

00:03:00 | 328.71     | 0     
00:18:00 | 331.31     | 0    
00:33:00 | 193.83     | 0    
00:03:00 | 0          | 321.21     
00:18:00 | 0          | 290.39
00:33:00 | 0          | 283.43

2 个答案:

答案 0 :(得分:1)

你非常接近,你只是缺少group by和聚合功能。

SELECT 
(CASE WHEN Timestamp>='2014-05-01' AND Timestamp<='2014-05-03' 
    THEN date_format(Timestamp,'%H:%i') ELSE 0 END) AS 'Hour', 
MAX((CASE WHEN Timestamp>='2014-05-01' AND Timestamp<='2014-05-02' 
    THEN speed ELSE NULL END)) AS '2014-05-01', 
MAX((CASE WHEN Timestamp>='2014-05-02' AND Timestamp<='2014-05-03' 
    THEN speed ELSE NULL END)) AS '2014-05-02' 
FROM `db_speed` 
WHERE Timestamp>='2014-05-01' AND Timestamp<='2014-05-10'
GROUP BY `Hour`

答案 1 :(得分:0)

不是你要求的结果表,但这个解决方案可能是更好的选择。 您可以从这样的查询开始,每个时间为每行,然后是逗号分隔的日期和速度列。

select TIME_FORMAT(Timestamp,'%H:%i:%s'), 
       group_concat(DATE(Timestamp)), 
       group_concat(speed) 
from db_speed GROUP BY MINUTE(Timestamp) ORDER BY Timestamp asc;

得到这样的结果:

TIME        GROUP_CONCAT(DATE(TS))  GROUP_CONCAT(SPEED)
00:03:00    2014-05-01,2014-05-02   328.71,321.21
00:18:00    2014-05-01,2014-05-02   331.31,290.39
00:33:00    2014-05-01,2014-05-02   193.83,283.43

在这里演示:http://sqlfiddle.com/#!2/fc340/11/0

然后,使用您选择的语言,您可以将分组的值拆分为数组或地图。