2017-01-12 11 views
0

私は別のオブジェクトを持つテーブルがあるとオブジェクトは時間をかけて進化するに従って、前の行の値を取得します。 1つのオブジェクトはobject_numberで識別され、object_line_numberで追跡できます。オブジェクトのすべての進化にはステータスがあります。PowerBIはフィルタ

ステータス間の経過時間を計算します。

以下は1 object_number "US1" のための私のテーブルです:

enter image description here

黄色では、開始日をrowscontainingています。これらは、(status_id = 0、(old_status <> 0またはobject_line_number = 1)、emergency_level = 1の場合に検出されます。

では、終了日を含む行です。これらは、(status_id = 2,3,4,5およびold_status = 0)の場合に検出されます。 OLD_STATUS

は、テーブルに存在しません。これは前の行(オブジェクトによる)の行番号(line_number)の状態です。私はDirectQueryモードで午前

old_status = CALCULATE (
MAX(fact_object[status_id]), 
FILTER (
     ALL(fact_object), 
     fact_object[object_line_number] = IF(fact_object[object_line_number]=1, fact_object[object_line_number], MAX (fact_object[object_line_number])-1)), 
VALUES (fact_object[object_number])) 

、私は対策を使用していますなぜこれほど多くの機能が計算列のために存在しない、それはだ:私はそれを、次の措置のおかげを取得しています。それが終わると

、私はその後、すべての行の前の黄色行のdate_modificationを取得できるようにしたいです。この例では

私は現在の緑色行のdate_modificationと前黄色行のdate_modification間の時間差を計算できるように、結果は4/4 1であろう。

date_receivedという名前の新しい列を追加することを考えていました。これは前の黄色の行のdate_modificationです。 enter image description here

そこから、私は唯一の緑の行を維持し、date_modificationdate_received間の差を計算しなければなりません。

マイ最終Calculがこの持っている実際には:緑色の行

結果は =(緑色行数date_modificationとdate_received < = 15分との間の日付の差)/(数 日( date_modification)= DAY(date_received))

しかし、私はそれを行う方法がわかりません。 私はこれを行うには OLD_STATUS対策の同じ精神で試してみました:

date_received = CALCULATE (
MAX(fact_object[date_modification]), 
FILTER (
    ALL(fact_object), 
    (fact_object[object_line_number] = MAX (fact_object[object_line_number])-1) && MY OTHER FILTERS 
), 
VALUES (fact_object[object_number]) 

) 

しかし、成功しませんでした。 SQLで

、同等のは次のようになります:

SELECT 
    SUM(CASE WHEN (DATEDIFF(MINUTE, T.date_received, T.date_planification) <= 15) THEN 1 ELSE 0 END)/
    SUM(CASE WHEN (DAY(T.date_received) = DAY(T.date_planification)) THEN 1 ELSE 0 END) as result 
FROM (
    SELECT *, T.status_id as current_status, 
     LAG(T.date_modification) OVER(PARTITION BY T.object_number ORDER BY T.object_line_number) as date_received, 
     T.date_modification as date_planification 
    FROM 
    (
     select *, 
      LAG (status_id) OVER(PARTITION BY object_number ORDER BY object_line_number) AS old_status 
     from dbo.fact_object 
    ) AS T 
    WHERE ((T.status_id = 0 AND (T.old_status <> 0 OR T.object_line_number = 1) AND T.emergency_level = 1) OR (T.old_status = 0 AND T.status_id IN (2,3,4,5)))--974 
) AS T 
WHERE old_status = 0 

(まあ、多分私がやったSQLでそれを行うには良い方法があります)。

どうすればこの問題を解決できますか?この場合

答えて

0

、Iは、第1のオブジェクト行番号によって、次に、オブジェクトによってテーブルをソートすることになる(又は更新日時 - 。これらは行ごとに変化しないように見える)

テーブル

表1を複製 - 1 表2から始まるインデックスを追加 - MergedStatus ID(NextStatusIDに名前を変更)とOBを展開し、表1から0

から始まるインデックスを追加table2のでそれをマージし、新しいインデックスフィールドに

を使用してject(名前を変更してNextObject)フィールドに追加します。

新しい条件付き列を作成して、2つのステータスフィールドを比較できるようになりました。例えば。ステータス2 =オブジェクト= NextObjectの場合、[NextStatusID] else null