PostgreSQL 9.3的新类型的关节!横向关节发射相对低调,但在实现之前需要使用新的查询来获得强大的编程能力。在本文中,我将介绍一个在PostgreSQL 9.2不可能实现的渠道分析。

横向联合是什么

最好的描述是在文档中从语句列表的底部:

横向可以是从子项目中选择前缀。这可以在引用之前对列表中的项进行选择。(没有横向,每个选择的子项彼此独立,因此不能从其他交叉引用)。

…

当a包含横向交叉引用时,计算过程如下:对于每行的从喜欢到交叉引用列的查询,或者更像从提供引用集合列,横向将设置行或行值的计算方法。通常将计算结果集添加到查询中。这个过程在源表行或列的集合中重复。

这算是有点迟钝。你可以松散的横向联合理解SQL foreach的选择,在这一周期将结果集的每一行一个PostgreSQL的周期,和线作为参数进行计算,第二查询。

我们能用这个做什么

查看用于记录单击事件的表结构。






创建表(事件)
user_id bigint,
Event_id BIGINT,
时间时长不空,
数据JSON不是空的,
主键(user_id,event_id)
)



每个事件都与用户关联。它有一个ID、一个时间戳和一个JSON数据块。使用堆中的事件属性。这些属性可能包含单击、窗口标题、会话引用等DOM级别的信息。

加入我们优化我们的登录页面,以增加注册。第一步是计算转换的哪个通道丢失了用户。





示例:注册过程的步骤之间的通道转换率。



假设我们前面有单位装备,按照这个程序记录事件日志,所有的数据都会保存到表中的事件数据中,开始是一个。{ 1 },我们要计算有多少人看到我们的家,他们有两周后在主页上看到多少百分比的输入验证信息。如果我们使用PostgreSQL的旧版本,我们可以写一些自定义功能需要使用PL / pgsql PostgreSQL内置程序语言。但在9.3,我们可以结合使用侧,计算结果与一个有趣的查询不需要任何延伸或PL / pgsql。






选择
user_id,
view_homepage,
view_homepage_time,
enter_credit_card,
enter_credit_card_time
(从
获得第一次每个用户查看主页。
选择
user_id,
1 view_homepage,
分钟(时间)为view_homepage_time
从事件
哪里
数据- > >类型= 'view_homepage
集团通过user_id
左连接外侧(E1)
对于每一行,得到user_id做enter_credit_card第一时间
事件,如果有两周内view_homepage_time。
选择
1 enter_credit_card,
时间enter_credit_card_time
从事件
哪里
user_id = e1.user_id和
数据- > >类型= 'enter_credit_card
view_homepage_time之间的时间(view_homepage_time + 1000 * 60 * 60 * 24 * 14)
按时间顺序排列
限制1
)E2为真



没有人会喜欢超过30行的SQL查询,所以让我们将SQL分析成片段:






选择
user_id,
1 view_homepage,
分钟(时间)为view_homepage_time
从事件
哪里
数据- > >类型= 'view_homepage
集团通过user_id



这是让每个用户第一次view_homepage时间。然后,我们可以对结果集的每一行进行联合横向迭代,并在下一个参数中执行查询。这相当于要在结果集的每一行下面的边上执行的查询:






选择
1 enter_credit_card,
时间enter_credit_card_time
从事件
哪里
user_id = e1.user_id和
数据- > >类型= 'enter_credit_card
view_homepage_time之间的时间(view_homepage_time + 1000 * 60 * 60 * 24 * 14)
按时间顺序排列
限制1



例如,对于每个用户,两周后获得的事件view_homepage_time事件enter_credit_card时间。因为这是一个组合的侧面,我们可以从以前的子查询结果在参考view_homepage_time查询。否则,它只能分离子查询执行,而不能访问子查询结果集。

然后,我们将它封装到一个选择中,它返回如下所示的内容:


user_id view_homepage view_homepage_time enter_credit_card | | | | enter_credit_card_time
--------- + + + + ------------------------ ------------------- -------------------- ---------------
567 1 5234567890 1 | | | | 5839367890
234 | 1 | 2234567890 | |
345 | 1 | 3234567890 | |
456 | 1 | 4234567890 | |
678 | 1 | 6234567890 | |
123 | 1 | 1234567890 | |
…






因为这是一个左连接,所以会有不匹配的行在查询结果集enter_credit_card事件,只要有view_homepage事件。如果我们总结所有的数值列,我们将得到一个清晰的通道转换总结。






选择
和(view_homepage)作为viewed_homepage,
和(enter_credit_card)作为entered_credit_card
(从
获得第一次每个用户查看主页。
选择
user_id,
1 view_homepage,
分钟(时间)为view_homepage_time
从事件
哪里
数据- > >类型= 'view_homepage
集团通过user_id
左连接外侧(E1)
每个(user_id,view_homepage_time)元组,得到第一次
用户也enter_credit_card事件,如果有两周内。
选择
1 enter_credit_card,
时间enter_credit_card_time
从事件
哪里
user_id = e1.user_id和
数据- > >类型= 'enter_credit_card
view_homepage_time之间的时间(view_homepage_time + 1000 * 60 * 60 * 24 * 14)
按时间顺序排列
限制1
)E2为真



它会输出:


viewed_homepage entered_credit_card |
----------------- + ---------------------
827 | 10






我们可以用更多横向组合的中间步骤来填充这个通道,以获得我们在过程中需要关注的部分。让我们向示例步骤添加查询,查看主页和输入验证信息。






选择
和(view_homepage)作为viewed_homepage,
和(use_demo)作为use_demo,
和(enter_credit_card)作为entered_credit_card
(从
获得第一次每个用户查看主页。
选择
user_id,
1 view_homepage,
分钟(时间)为view_homepage_time
从事件
哪里
数据- > >类型= 'view_homepage
集团通过user_id
左连接外侧(E1)
对于每一行,得到user_id做use_demo第一时间
事件,如果存在一个view_homepage_time一周内。
选择
user_id,
1 use_demo,
时间use_demo_time
从事件
哪里
user_id = e1.user_id和
数据- > >类型= 'use_demo
view_homepage_time之间的时间(view_homepage_time + 1000 * 60 * 60 * 24 * 7)
按时间顺序排列
限制1
左真侧E2)
对于每一行,得到user_id做enter_credit_card第一时间
事件,如果存在一个use_demo_time一周内。
选择
1 enter_credit_card,
时间enter_credit_card_time
从事件
哪里
user_id = e2.user_id和
数据- > >类型= 'enter_credit_card
use_demo_time之间的时间(use_demo_time + 1000 * 60 * 60 * 24 * 7)
按时间顺序排列
限制1
E3真版



这将输出:


viewed_homepage use_demo entered_credit_card | |
----------------- + ---------- + ---------------------
827 | 220 | 86






从首页看一周的演示,并在一周内输入信用卡信息,这为我们提供了三个通道转换的步骤。此后,强大的PostgreSQL可以使这些数据进行深入的分析,并现场进行了全面的分析。然后我们可能会遇到以下问题:

使用演示是否可以增加注册的可能性。
我们的主页用户是否通过广告与其他频道的转换率相同
转换率会随着不同的A/B测试变量的变化而变化。


这些问题的答案将直接影响到产品的改进,它可以在PostgreSQL数据库,因为它现在支持横向联盟。



没有横向联合,我们只能使用PL / pgsql做分析。或者,如果我们的数据集是非常小的,我们可以不碰这些复杂和低效利用探索性数据查询。在一个场景中,你可能只是在PostgreSQL中提取数据,并使用脚本语言进行分析。但仍然有强大的理由与SQL表达这些问题,特别是如果你正试图将整个包装成一套易于理解的用户界面和非技术用户发布功能。

注意,这些查询可以优化以提高效率。在这种情况下,如果我们在(user_id,(数据- > >类型)、时间)对B树索引的创建,我们可以找到每个用户每个通道只有一个指标的计算步骤。如果你使用的是SSD,上面的搜索成本很小,就足够了。如果不是,你可能需要用稍微不同的方式显示你的数据,我会在另一篇文章中留下详细信息。