0

さまざまなオブジェクトを含むテーブルがあり、オブジェクトは時間とともに進化します。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_modificationdate_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でそれを行うより良い方法があるかもしれません)。

どうすればこれを達成できますか?

4

1 に答える 1