さまざまなオブジェクトを含むテーブルがあり、オブジェクトは時間とともに進化します。1 つのオブジェクトはobject_numberで識別され、object_line_numberで追跡できます。そして、オブジェクトのすべての進化にはステータスがあります。
あるステータス間の経過時間を計算したい。
以下は、1 つの object_number "us1" のテーブルです。
黄色は、開始日を含む行です。(status_id = 0 and (old_status <> 0 or object_line_number = 1) and Emergency_level = 1) の場合に検出されます。
緑色は、終了日を含む行です。それらは (status_id =2,3,4,5 および old_status = 0) の場合に見つかります。
列old_statusがテーブルに存在しません。これは前の行のステータスです (オブジェクトによると)line_number)。次の措置のおかげで、私はそれを取得しています:
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]))
私はDirectQueryモードを使用しているため、計算列には多くの関数が存在しません。そのため、メジャーを使用しています。
それが完了したら、すべての緑色の行について、前の黄色の行のdate_modificationを取得できるようにしたいと考えています。
この例では、結果は 4/4 の次に 1 になります。これにより、現在の緑色の行のdate_modificationと前の黄色の行のdate_modificationの間の時間差を計算できます。
そのため、前の黄色の行の date_modification である date_receivedという名前の新しい列を追加することを考えていました。
そこから、緑色の行のみを保持し、 date_modificationとdate_receivedの差を計算するだけです。
私の最終的な計算は、実際にはこれを持つことです:
結果= (date_modification と date_received の日付の差 <= 15 分である緑色の行の数) / (DAY(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でそれを行うより良い方法があるかもしれません)。
どうすればこれを達成できますか?