2016-11-04 9 views
-1

私は以下のようなテーブルを持っています。私は、アプリケーションとアプリケーションの状態が経時的に変化することを追跡する列を持っています。私はそれが日付の列のステータスを変更する時間を追跡します。テーブルはアプリケーションと日付の古いものから最新のものへの状態の変更によってソートされます。状況を表示するステータスとステータス間の時間と時間

 
+--------+-----------+--------+------------------+ 
| 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でビルドしようとしているテーブルのサンプルです。すべてのステータスについて、私は次のステータスをキャプチャしようとしています。以前のステータス列にはその行のステータスが表示され、次のステータスにはそのアプリケーションの次の行の次のステータスが表示されます。アプリケーションが最後の状態にある場合、次の状態は最後としてマークされます。次に、2つの日付間の時間差を計算してステータス間の時間を計算します。 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リードとラグ関数を使用して、これを達成できます。

次のように、app_id、ステータスをprev_status、日付をprev_date、リード(ステータス)を(app_id順の日付順)、next_status、リード(日付)(app_id順の日付順)で選択します。 next_date from table

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ステートメントを書くことができます。あなたが望むものはループで達成できるかもしれませんが、私はそれらを使ったことはありません。

サンプルテーブルの最後の2行と同じように、app_id、status_id、dateの重複した行がある場合は、テーブルの中で最初の行、またはそれらをランク付けする。

+0

ソリューションをありがとうと本当にあなたの努力に感謝します。機能を達成するのに役立つリードとLAGの機能があります。次のクエリは次のとおりです。select app_id、statusとしてprev_status、dateはprev_date、 リード(ステータス)by next_status、 リード(日付)(app_id順の日付順)next_date テーブル – user3202499

+0

からこれは素晴らしい情報です。共有してくれてありがとう。その機能については決して知らなかった。 – Balter

関連する問題