Sql 查询以根据 table 事件创建图表

Sql query to create graph from a table of events

我在 SQL 服务器中有一个普通的旧 table 像这样:

JOB    Step     Timestamp
----------------------------------
1      begin    12/25/2021 1:00 AM
1      foo      12/25/2021 1:01 AM
1      bar      12/25/2021 1:02 AM
1      end      12/25/2021 1:03 AM

这是一个步骤列表,从一个过渡到另一个,过渡由时间戳决定。我想将其呈现为事件图,因此我尝试使用如下结果查询它:

JOB    Source    Target   Timestamp
--------------------------------------------
1      begin     foo      12/25/2021 1:01 AM
1      foo       bar      12/25/2021 1:02 AM  
1      bar       end      12/25/2021 1:03 AM

这不是 SQL 服务器图 table 但我希望它在这种情况下表现得像一个。

这最终将使用 a force directed graph visualization 在 PowerBI 中呈现,因此 T-SQL 或 DAX 中的答案适用于我的用例。

在 t-sql 中,使用 lead() window 函数很简单,下面应该会产生您预期的结果

select JOB, [Source], [Target], [TimeStamp]
from (
    select JOB, Step [Source],
        Lead(Step) over(partition by JOB order by [Timestamp]) [Target],
        Lead([Timestamp]) over(partition by JOB order by [Timestamp]) [TimeStamp]
    from t
)t
where [Target] is not null;

DAX

你可以这样写两个措施来达到最终目标

Source =
VAR _time1 =
    MAX ( 'Table'[Timestamp] )
VAR _beginTime =
    CALCULATE (
        MAX ( 'Table'[Timestamp] ),
        FILTER (
            ALLSELECTED ( 'Table' ),
            'Table'[JOB] = MAX ( 'Table'[JOB] )
                && 'Table'[Timestamp] < _time1
        )
    )
VAR _begin =
    CALCULATE (
        MAX ( 'Table'[Step] ),
        FILTER (
            ALLSELECTED ( 'Table' ),
            'Table'[JOB] = MAX ( 'Table'[JOB] )
                && 'Table'[Timestamp] = _beginTime
        )
    )
RETURN
    _begin

    

Target =
IF ( [Source] <> BLANK (), MAX ( 'Table'[Step] ) )