2015-11-19 27 views
1

我有一個名爲bug_history_table見下表MySQL的選擇查詢,顯示增量datetime和默認值一些列

------------------------------------------------------------------------ 
| bug_id | date_modified  | field_changed | old_value | new_value | 
------------------------------------------------------------------------ 
| 14415 | 2015-11-03 13:52:32 | status  | unconfirm | open  | 
| 14415 | 2015-11-04 10:50:58 | status  | open  | resolved | 
| 14415 | 2015-11-10 11:27:41 | status  | resolved | verified | 
| 14415 | 2015-11-14 11:27:41 | status  | verified | closed | 
------------------------------------------------------------------------ 

給出上表顯示,從開啓到關閉的狀態錯誤的歷史。我想在錯誤處於空閒狀態時在兩個日期之間顯示結果,即狀態保持不變直到修改完成。

預期輸出 -

-------------------------------------- 
| bug_id | date_modified | new_value | 
-------------------------------------- 
| 14415 | 2015-11-03 | open  | 
| 14415 | 2015-11-04 | resolved | 
| 14415 | 2015-11-05 | resolved | <--- 
| 14415 | 2015-11-06 | resolved | <--- 
| 14415 | 2015-11-07 | resolved | <--- Need these extra rows. 
| 14415 | 2015-11-08 | resolved | <--- 
| 14415 | 2015-11-09 | resolved | <--- 
| 14415 | 2015-11-10 | verified | 
| 14415 | 2015-11-11 | verified | <--- 
| 14415 | 2015-11-12 | verified | <--- Need these extra rows. 
| 14415 | 2015-11-13 | verified | <--- 
| 14415 | 2015-11-14 | closed | 
-------------------------------------- 

中的條目被插入,只有當錯誤狀態被修改。現在讓我們舉例如下 -

如果在2015年11月3日發佈的bug是「已打開」,並且沒有用戶更新其狀態,直到2015-11-06這意味着bug仍然閒置3天。所以我想在2015-11-03,2015-11-04,2015-11-05這些天顯示該錯誤處於「已打開」狀態。

+0

當狀態空閒時,新舊字段的值是多少? –

+0

我編輯了我的問題並再次解釋。 –

+0

我在這裏沒有得到我的答案 –

回答

-1

您必須創建選擇錯誤的開始和結束日期然後返回日期列表的過程。以下線程將有助於創建過程。 Create date list

OR

閱讀本thread生成使用遞歸查詢的日期。

你最瞭解哪一方面。

+0

請仔細閱讀。有N個狀態改變N次的錯誤。這些日期應該在每個更改的狀態之間創建。例如從日期d1到dn,狀態爲OPEN的BugN的日期,以及從日期d1到dm等等的狀態RESOLVED,以及當我們創建這些中間日期時,我們必須將先前的狀態值設置爲新創建的日期,直到下一個狀態更新。 –

+0

是的,你可以通過使用上述技術來獲得結果。 –

+0

我不是要求獲得中間日期列表的邏輯。所需的邏輯是在連續行中的日期之間選擇與相同的bug ID相關聯,然後將先前的狀態值分配給新的日期,直到下一個狀態被改變... –

1

使這個解決方案最簡單的方法是使用一個過程,製作一個你需要的日期表,然後與這個表連接。

drop temporary table if exists tmp_dates; 
create temporary table tmp_dates(_date timestamp); 
set @tmp_date = start_date; 
while @tmp_date <= end_date do 

    insert into tmp_dates values (@tmp_date); 
    set @tmp_date = @tmp_date+interval 1 day; 

end while; 

select a._date,b.bug_id,ifnull(b.new_value,'resolved',b.new_value) from tmp_dates a 
left join bug_history_table b on a._date = b.date_modified; 
+0

這是一個很好的選擇,但是如果null的狀態值則被設置爲之前的狀態。我將不得不寫這部分。 謝謝 –