Sql 为Sankey图表准备里程碑时间戳

Sql 为Sankey图表准备里程碑时间戳,sql,google-bigquery,Sql,Google Bigquery,我正试图绘制出新用户如何通过我们的不同里程碑移动,并且我一直在尝试通过SQL查询生成数据,以便将其输入到我们在谷歌图表中的可视化中 大多数用户会经历7-10个关键里程碑,但他们会按照不同的顺序完成 我目前拥有以下格式的数据: user_id | milestone_x | milestone_y | milestone_z 1 | ts | ts | ts 2 | ts | ts | ts ...

我正试图绘制出新用户如何通过我们的不同里程碑移动,并且我一直在尝试通过SQL查询生成数据,以便将其输入到我们在谷歌图表中的可视化中

大多数用户会经历7-10个关键里程碑,但他们会按照不同的顺序完成

我目前拥有以下格式的数据:

user_id | milestone_x | milestone_y | milestone_z
1       | ts          | ts          | ts
2       | ts          | ts          | ts
...
我正在尝试创建以下数据集以导出到Google图表:

(1) milestone_x | (2) milestone_y | 200
(1) milestone_x | (2) milestone_z | 150
(1) milestone_y | (2) milestone_x | 250
...
(2) milestone_y | (3) milestone_x | 50
...
。。因此我可以将其转换为数组:

[
    ['(1) milestone_x', '(2) milestone_y', 200],
    ['(1) milestone_x', '(2) milestone_z', 150],
    ['(1) milestone_y', '(2) milestone_x', 250],
    ...
    ['(2) milestone_y', '(3) milestone_x', 50],
    ...
]
并把它放在谷歌图表的Sankey图表中

我一直在尝试用SQL(Google BigQuery)实现这一点,但我能找到的唯一方法是为每个结果写一行,这对于大量不同的路径是不可行的


我是否应该导出数据集并用其他语言/工具执行?或者,有没有一种方法可以在SQL中真正实现这一点?

如果我理解正确,您需要从一个里程碑到下一个里程碑的平均时间,但顺序取决于时间戳,而不是列

您可以通过取消激活数据来解决这个问题,因此每个里程碑有一行。然后枚举行并使用自联接:

with data as (
      select 1 as user_id, 1 as milestone_x, 2 as milestone_y, 3 as milestone_z union all
      select 2 as user_id, 4 as milestone_x, 2 as milestone_y, 3 as milestone_z
     ),
     unpivoted as (
      select d.user_id, m.*, row_number() over (partition by d.user_id order by ts) as seqnum
      from data d cross join
           unnest(array[struct('milestone_x' as milestone, d.milestone_x as ts),
                        struct('milestone_y', milestone_y),
                        struct('milestone_z', milestone_z)]
                 ) m
     )
select u1.milestone, u2.milestone, avg(u2.ts - u1.ts) as diff
from unpivoted u1 join
     unpivoted u2
     on u1.user_id = u2.user_id and
        u1.seqnum = u2.seqnum - 1
group by u1.milestone, u2.milestone
 

你的结果(1)和(2)是什么?这些数字,比如200和150是从哪里来的?你应该更详细地解释你的数据和预期结果!
(1)
(2)
等旨在按照公司达到里程碑的顺序来分隔里程碑,因此(1)里程碑_x将是以里程碑_x开始的公司,以及(2)里程碑_x是指他们在第一个里程碑到达另一个里程碑后,又到达了第二个里程碑。不完全是——我只是在寻找通过里程碑的不同路径。因此,一个用户的路径类似。。(x->y->z),另一个路径类似于(y->z-x),我想在Sankey图表中显示最常见的旅程。