使用HierarchyID计算聚合路径

时间:2010-03-03 00:59:56

标签: tsql

业务问题 - 使用分析数据了解流程后果。

以下是我们迄今为止所做的工作:

  1. 使用每个可能的流程步骤构建字典表
  2. 查找每个流程“开始”
  3. 查找每次开始的最后一步
  4. 将字典表连接到最后一步,找到最后一步的路径
  5. 在最终报告输出中,我们最终得到每个最后一步开始的路径列表:

    User   Fallout Step HierarchyID.ToString()
    A      1/1/1
    B      1/1/1/1/1
    C      1/1/1/1
    D      1/1/1
    E      1/1
    

    这意味着五个用户(A-E)启动了该过程。假设只有用户B完成,其他四个没有。由于这是一个简单的例子(没有分支),我们希望输出看起来如下:

    Step   Unique Users
    1      5
    2      5
    3      4
    4      2
    5      1
    

    我能想到的最简单的解决方案是获取每个hierarchyID.ToString(),将其解析为一组子路径,JOIN回到字典表,然后使用GROUP BY输出。

    考虑到数据量,我想使用内置的HierarchyID函数,例如: IsAncestorOf。

    我有什么想法或想法可以写这个吗?也许是一个递归的CTE?

2 个答案:

答案 0 :(得分:1)

重组数据可能有助于此。例如,像这样构造数据:

User  Step  Process#
----  ----  --------
A     1     1
A     2     1
A     3     1
B     1     2
B     2     2
B     3     2
B     4     2
B     5     2
E     1     3
E     2     3
E     1     4
E     2     4
E     3     4

允许您运行以下查询:

select step, 
  count(distinct process#) as process_iterations, 
  count(distinct user) as unique_users
from stepdata
group by step
order by step;

返回:

Step  Process_Iterations  Unique_Users
----  ------------------  ------------
1     4                   3
2     4                   3
3     3                   3
4     1                   1
5     1                   1

答案 1 :(得分:0)

我不熟悉hierarchyid,但将数据拆分成块进行分析看起来就像问题数字表非常适合。加入一个数字表来对照余波中的各个子串,并且不应该太难将整个事物视为一个表并在运行中进行分析,而不需要任何非设置操作。