2016-11-04 78 views
-1

我有一張表,如下所示。我有專欄跟蹤應用程序和應用程序狀態隨時間的變化。我跟蹤它在日期欄中更改狀態的時間。該表按應用程序和狀態從最舊到最新更改的日期排序。計算狀態Chages和狀態之間的時間

 
+--------+-----------+--------+------------------+ 
| app_id | status_id | row_no |  date  | 
+--------+-----------+--------+------------------+ 
|  1 | a   |  10 | 2016-10-04 21:35 | 
|  1 | b   |  11 | 2016-10-12 21:50 | 
|  1 | c   |  12 | 2016-10-25 20:40 | 
|  1 | d   |  13 | 2016-10-26 16:10 | 
|  1 | e   |  14 | 2016-10-26 16:10 | 
|  2 | a   |  20 | 2016-09-15 1:26 | 
|  2 | c   |  21 | 2016-09-15 21:32 | 
|  2 | d   |  22 | 2016-09-16 21:51 | 
|  2 | e   |  23 | 2016-09-16 21:51 | 
|  2 | f   |  24 | 2016-09-20 22:55 | 
|  2 | g   |  25 | 2016-10-20 22:46 | 
|  2 | g   |  26 | 2016-10-20 22:46 | 
+--------+-----------+--------+------------------+ 

我正試圖在應用程序到達最終狀態之前花費多少時間。以下是我試圖在Sql中構建的表的示例。對於我試圖捕捉下一個狀態的每個狀態。以前的狀態欄顯示該行的狀態,而下一個狀態顯示該應用程序下一行的下一個狀態。如果應用程序處於最後狀態,則下一個狀態標記爲Last。接下來我通過計算兩個日期之間的小時差異來計算狀態之間的時間。如果你能告訴我如何在Sql中實現這個功能,我將非常感激。先謝謝你。

 
+--------+-----------+--------+------------------+-----------------+-------------+--------------+ 
| app_id | status_id | row_no |  date  | previous status | next status | time between | 
+--------+-----------+--------+------------------+-----------------+-------------+--------------+ 
|  1 | a   |  10 | 2016-10-04 21:35 | a    | b   | 192.2333333 | 
|  1 | b   |  11 | 2016-10-12 21:50 | b    | c   | 334.8333333 | 
|  1 | c   |  12 | 2016-10-25 20:40 | c    | d   | 43.48333333 | 
|  1 | d   |  13 | 2016-10-26 16:10 | d    | e   | 0   | 
|  1 | e   |  14 | 2016-10-26 16:10 | e    | Last  | Last   | 
|  2 | a   |  20 | 2016-09-15 1:26 | a    | c   | 20.08333333 | 
|  2 | c   |  21 | 2016-09-15 21:32 | c    | d   | 24.31666667 | 
|  2 | d   |  22 | 2016-09-16 21:51 | d    | e   | 0   | 
|  2 | e   |  23 | 2016-09-16 21:51 | e    | f   | 97.06666667 | 
|  2 | f   |  24 | 2016-09-20 22:55 | f    | g   | 743.8333333 | 
|  2 | g   |  25 | 2016-10-20 22:46 | g    | g   | 0   | 
|  2 | g   |  26 | 2016-10-20 22:46 | g    | Last  | Last   | 
+--------+-----------+--------+------------------+-----------------+-------------+--------------+ 

+1

我刪除了不兼容的數據庫標記。爲您實際使用的數據庫添加標籤。 –

+0

你能把這個樣本數據轉化成清晰的東西嗎?目前發佈是不可能破譯的。 –

+0

@SeanLange我的歉意,它沒有正確格式。 – user3202499

回答

0

使用Sql Lead和Lag函數我們可以實現這一點。以下是查詢:

選擇app_id,狀態爲prev_status,日期爲prev_date,導致(狀態)結束(由app_id按日期排序的分區)爲next_status,導致(日期)結束(由app_id按日期排序的分區)爲來自表

的next_date
1

這是一個有點亂,但如果你有STATUS_ID的已知量,你可以嘗試讓每一個在「有」的條款,並在上APP_ID的末端連接它們放在一起。然後製作一個計算A和B之間,B和C之間等等的最終表格。然而,這不會產生像你所做的那樣的表格。但它應該得到所有的時間差異。

with A_table as (
select 
app_id, 
date A_status 
where status_id = 'a' 
) 
, B_table (
select 
app_id, 
date B_status 
where status_id = 'b' 
) 
--MORE STATUS TABLE HERE 

, combined_table (
select 
a.app_id, 
a.A_status, 
b.B_status, 
--MORE STATUS DATES HERE 
from A_table a 
left outer join B_table b on a.app_id = b.app_id 
--LEFT OUTER JOIN MORE STATUS TABLES ON A_TABLE HERE 
--YOU'RE MAKING ONE TABLE WITH EACH APP_ID ON ONE ROW WITH ALL TIME STAMPS 
) 
select 
*, 
B_status - A_status A_B 
--MORE TIME SUBTRACTIONS HERE 
--SINCE YOU'VE OUTER JOINED ABOVE, YOU'LL HAVE COLUMNS FOR ALL POSSIBLE 
--STATUS STEPS AND THOSE WHICH DIDN'T HAVE THAT STEP WILL BE NULL 
from combined 

這是一種笨重但有固定數量的狀態步驟,應該完成工作。但它沒有考慮哪一步是「最後一步」。我不知道這有多重要。您總是可以編寫一個case語句來查看下一步是否爲空。你想要什麼可以用循環來實現,但我從來沒有使用過這些。

另外請注意,如果你有app_id,status_id和date的重複行,就像你的示例表中的最後兩行那樣,你需要在表格中對這些行進行排序,比如只讀取第一行,或排名他們。

+0

感謝您的解決方案,並非常感謝您的努力。有Lead和LAG功能幫助我實現功能。這裏是查詢:select app_id,狀態爲prev_status,日期爲prev_date, lead(狀態)結束(按app_id按日期排序)作爲next_status, 導致(日期)結束(按日期排序的app_id排序)作爲next_date 從表 – user3202499

+0

哇,這是很好的信息。感謝分享。從來不知道這個功能。 – Balter