按上一步过滤当前步骤

问题描述 投票:0回答:1

我有访问者 ID 访问的每个页面的网络流量数据。我们有一个“漏斗”,访问者从步骤 A 到步骤 B,再到步骤 C,等等。考虑一下通过多个步骤注册新帐户之类的事情。

可以独立到达各个步骤,但一般来说,它们按 A、B、C 等顺序进行。我想要做的是获取 A 的所有唯一访问者的列表,然后仅计算访问者所在的 B集合 A,然后计算 C 存在于集合 B 中的位置,等等。如果这只是两三个步骤,则可能非常简单和/或手动,但有很多步骤。我正在寻找最有效的逻辑来获得这些结果。我考虑过 CTE,但我真的不太确定如何将其连接到自身。

对于在数千万条记录上执行此操作的逻辑(和高性能/高效)方法有什么想法吗?谢谢!

一些示例数据:

visitor_id 步骤 序列
1 A 1
1 B 2
2 A 1
2 B 2
2 C 3

所需输出:

步骤 独特访客数量
A 1000
B 950
C 800
sql sql-server common-table-expression
1个回答
0
投票

假设:

  1. 有效的访客计数始终从步骤 A 开始,并且,
  2. 他们必须遵循正确的顺序,即不跳过任何一步,
  3. 最大可能步数为 26 个字母

那么这可能是一个答案。

我正在使用计数表来动态生成字母表

CREATE TABLE dbo.VisitorSteps (
    visitor_id INT,
    step CHAR(1),
    seq INT
);

INSERT INTO dbo.VisitorSteps (visitor_id, step, seq)
VALUES
    (1, 'A', 1),
    (1, 'B', 2),
    (2, 'A', 1),
    (3, 'A', 1),
    (3, 'B', 2),
    (3, 'C', 3),
    (3, 'B', 2),
    (3, 'C', 3),    
    (4, 'B', 1),
    (4, 'C', 2),
    (5, 'A', 1),
    (5, 'B', 2),
    (5, 'C', 3);

;WITH    
     lv0 AS (SELECT 0 g UNION ALL SELECT 0)
    ,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
    ,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
    ,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
    ,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv3)
    ,Alphabet AS (
SELECT  Alpha=Char(T.n+64), seq=T.n 
FROM    Tally T
WHERE   T.n <= 26
) , _data
AS(
    SELECT   V.*, A.Alpha
        ,chk = iif(A.seq <> V.seq, 0, 1) /*not skipping a step*/
    FROM Alphabet A 
    outer apply dbo.VisitorSteps V 
    WHERE   V.Step = A.Alpha
)
SELECT   unique_visitor_count=
            count(distinct D.visitor_id)
        ,D.step
FROM _data D 
WHERE   D.chk = 1
GROUP BY D.step ;

输出:

© www.soinside.com 2019 - 2024. All rights reserved.