根据需要转换MySQL表的结果

时间:2017-05-30 15:36:18

标签: mysql row rds

我们处理的mysql表格包含以下格式的数据:

    entityId    status    updated_date
    -------------------------------
      1          1        29/05/2017 12:00 
      1          2        29/05/2017 03:00
      1          3        29/05/2017 07:00
      1          4        29/05/2017 14:00
      1          5        30/05/2017 02:00
      1          6        30/05/2017 08:00
      2          1        31/05/2017 03:00
      2          2        31/05/2017 05:00
      .
      .   

因此每个实体ID都有6个状态,每个状态都有一个更新日期时间。每个状态都附加一个活动。 例如1 - 开始旅程              2 - 到达第一个目的地              3 - 左点A,向B.等移动

我需要以下面的格式获取特定实体ID的输出,例如3和4.我需要独立的状态3和4的时间。

  entity_id   time_started_journey   time_reached_first_destination
           (update time of status 3)   (update time of status 4)
  --------------------------------------------------------------
      1       29/05/2017 7:00         29/05/2017 14:00   
      2       30/05/2017 7:00         30/05/2017 16:00

稍后我需要计算两者之间的总时间。

如何使用mysql实现所需的结果。

我尝试使用Union运算符,但无法将列分开。 此外,尝试使用案例when operator进行以下查询,但失败了。

 select distinct entityid,
 (case status when 3 then freight_update_time else 0 end) 
 as starttime,
 (case status when 4 then freight_update_time else 0 end) as endtime
 from table ;

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

条件聚合是返回看起来像这样的结果集的一种方法。

 SELECT t.entityid
      , MAX(IF(t.status=3,t.updated_date,NULL)) AS time_started_journey
      , MAX(IF(t.status-4,t.updated_date,NULL)) AS time_reached_first_destination
   FROM mytable t
  WHERE t.status IN (3,4)
  GROUP BY t.entityid 
  ORDER BY t.entityid

这只是一个建议;规范不清楚查询应该对给定entityid的重复状态值做什么。

还有其他查询模式会返回类似的结果。

答案 1 :(得分:1)

我在MySQL中的查询

SELECT
    e3.updated_date AS sta3,
    e4.updated_date AS sta4
FROM
    `prueba` AS e3
LEFT JOIN prueba AS e4
ON
    e3.entityId = e4.entityId AND e4.status = 4
WHERE
    e3.status = 3

输出:

result screenshot