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] ) )
我在 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] ) )