私は別のオブジェクトを持つテーブルがあるとオブジェクトは時間をかけて進化するに従って、前の行の値を取得します。 1つのオブジェクトはobject_numberで識別され、object_line_numberで追跡できます。オブジェクトのすべての進化にはステータスがあります。PowerBIはフィルタ
ステータス間の経過時間を計算します。
以下は1 object_number "US1" のための私のテーブルです:
黄色では、開始日を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です。
そこから、私は唯一の緑の行を維持し、date_modificationとdate_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でそれを行うには良い方法があります)。
どうすればこの問題を解決できますか?この場合