我使用谷歌大查询跟踪一些客户点击到我的网站。我遵循一个简单的规则集:
我只想看到第一个击中来源,如果客户已经通过同一来源多次连续同一天。
我只想看到第一个击中来源,如果客户已经通过同一来源多次连续在不同的日子。
我想看到所有的命中源,如果他们出现在同一天,但不是连续的。
目前,我正在使用以下工具:
rank() over (partition by customer_code, hit_source order by hit_timedate) rnk
如果我过滤“where rnk=1”,这允许我完成前2个步骤。这只会给我不同的命中源,无论他们是否在同一天,因为我有一个命中时间内的时间。但是它没有给我第三步,因为排名是由命中源划分的,当它看到同一个源时会改变。
如果有人能帮我这个忙,我将不胜感激。
编辑:
不确定如何添加/上载示例数据集,因此我尝试在此处执行此操作:
Customer_Code Hit_Source Hit_Timedate
101 Facebook 25/05/2020 10:30am
101 Facebook 25/05/2020 11:45am
101 Facebook 25/05/2020 11:55am
101 Twitter 25/05/2020 12:30am
101 Facebook 25/05/2020 13:00pm
101 Google 25/05/2020 15:00pm
101 Instagram 26/05/2020 09:00am
理想的结果集应该是这样的:
Customer_Code Hit_Source Hit_Timedate Rank
101 Facebook 25/05/2020 10:30am 1
101 Facebook 25/05/2020 11:45am 2
101 Facebook 25/05/2020 11:55am 3
101 Twitter 25/05/2020 12:30am 1
101 Facebook 25/05/2020 13:00pm 1
101 Google 25/05/2020 15:00pm 1
101 Instagram 26/05/2020 09:00am 1
所以,根据我的规则,我想实现上面的。。我在这里遇到的主要问题是能否将示例中的第5行排序为“1”。我之所以这么做,是因为上两次“facebook”的点击不是连续的。但能做到这一点与前两个规则,我已经实施了我挣扎。
2条答案
按热度按时间ebdffaop1#
你可以用
lag()
以及累计计数:其思想是创建一个标志,表明前一个源是否与当前行相同——如果不相同,则添加1。这个
1 +
因为计数将从0
你想让计数从1
.fjnneemd2#
为了进一步为社区做出贡献,我将使用lag()、sum()、case-when和用于bigquery的min()内置函数来共享不同的方法。
以下代码使用您提供的示例数据分为两个步骤(在中注解):
以及最终输出,
请注意,在步骤1中,一个新列的前一个值为
Hit_Source
已创建。然后在步骤2中,一个新的列rank_aux
是为了正确聚合结果而创建的。以下是步骤2的输出(仅用于解释目的):注意第二、三、四排
rank_aux=2
,这是所需的输出,因此可以将这些列聚合为1并仅显示最小值Hit_Timedate
以获取已共享的最终输出。