2017-05-30 35 views
0

轉換一個MySQL表的結果,我們對工作的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 ; 

任何人都可以點亮這個?

+0

你在正確的軌道上的情況下表達,但你需要使用聚合(GROUP_CONCAT明確),而不是的DISTINCT,並且案例的其他部分是'else null'(聚合通常忽略空值)。至於時差問題,您需要將您的日期字符串轉換爲適當的日期值;那麼你可以使用MySQL的內置日期函數。 – Uueerdo

+0

參見:[?我爲什麼要提供什麼,在我看來是一個非常簡單的SQL查詢的MCVE(https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve -for - 什麼 - 似乎對我將要-A-極簡單的SQL查詢) – Strawberry

回答

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

我在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 

OUTPUT:

result screenshot