「ClickhouseArray的力量」2-1

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。


上篇文章阐述了基本的数组行为:我们介绍了基本的数组语法,使用数组来模拟键值对,以及如何使用ARRAY JOIN将数组的值展开到表中。正如我们所指出的,这些功能已经为用户提供了巨大的力量,但还有更多的东西。

在当前的文章中,我们将挖掘数组和GROUP BY子句之间的整合。这种整合为用户提供了解决问题的工具,如识别事件序列和进行漏斗分析。漏斗分析是一种重要的技术,它可以衡量朝向特定目标的进展,例如让用户在网站上购买产品。

我们将展示它是如何使用数组工作的,然后展示使用 **ClickHouse windowFunnel()** 的替代方法。

构建 sequences

跟踪序列(可以理解为埋点)是分析应用中的一个常见问题。它出现在许多用例中,从跟踪用户通过在线服务的路径到计算飞机的行程。在本节中,我们将探讨如何使用数组来跟踪事件的序列。我们将寻求解决以下问题:显示一架商业飞机在一天内完成的最长行程。

我们的数据集是 流行的航空公司准点率数据,该数据集可用于ClickHouse。它可以按照ClickHouse文档中的说明下载。其结果是一个名为 "ontime"的 table,其中包含美国出发地和目的地机场之间的每个商业航空公司航班的一行。

为了追踪一架飞机在一天内穿越的路径,我们需要找到该飞机的所有航班,将他们排序,然后计算由此产生的跳数来进行排序。飞机由其尾号来识别。让我们先算出任何飞机的最大跳数。这不需要数组,用GROUP BY就可以轻松做到。下面是一个例子,找到在2017年1月15日飞行次数最多的飞机:

SELECT Carrier, TailNum, count(*) AS Hops
FROM ontime
WHERE (FlightDate = toDate('2017-01-15')) AND (DepTime < ArrTime)
GROUP BY Carrier, TailNum
ORDER BY Hops DESC, Carrier, TailNum
LIMIT 5

/* sql answer*/
┌─Carrier─┬─TailNum─┬─Hops─┐
│ HA      │ N488HA  │   14 │
│ HA      │ N492HA  │   14 │
│ HA      │ N493HA  │   14 │
│ HA      │ N483HA  │   12 │
│ HA      │ N489HA  │   12 │
└─────────┴─────────┴──────┘
复制代码

赢家实际上有3个: N488HA、N492HA和N493HA。所有飞机都属于夏威夷航空公司。美国的飞机迷们不会感到惊讶:夏威夷航空公司在岛屿之间运营短途航班,机场之间的距离只有50英里(为了增加乐趣,你可以在这里查询飞机尾号,以了解有关飞机的更多信息)。