带有 unnest 的嵌套 SQL 评估问题
Posted
技术标签:
【中文标题】带有 unnest 的嵌套 SQL 评估问题【英文标题】:Nested SQL evaluation question with unnest 【发布时间】:2020-05-03 23:59:18 【问题描述】:这可能是一个基本问题,但我就是想不通。样本数据和查询可以在here 找到。 (在“First-touch”标签下)
我将跳过此处的营销术语,但基本上查询所做的是将积分/积分归因于基于特定规则的展示位置(广告)。在这里,规则是“第一次接触”,这意味着功劳归于第一个与之交互的广告用户 - 可以是查看或点击。这里的“FLOODLIGHT”是指用户采取行动实际购买产品(转化)。
正如您在示例数据中看到的,用户 1 有一次转化,第一个广告是展示位置 22(首次触摸),因此 22 获得 1 分。用户 2 有两次转化,每个广告的第一个广告是 11,因此 11 获得 2 分。
这里的逻辑很简单,但我很难理解查询本身。比较prev_conversion_event.event_time < conversion_event.event_time
有什么意义?它们本质上不一样吗?我的意思是他们都来自UNNEST(t.*_path.events)
。而attributed_event.event_time
也来自同一个地方。
在这种情况下,prev_conversion_event.event_time
、conversion_event.event_time
和 attributed_event.event_time
的评估结果是什么?我只是在这里感到困惑。非常感谢您的帮助!
为方便起见,我将粘贴示例数据、查询和输出如下: Sample data Output
/* Substitute *_paths for the specific paths table that you want to query. */
SELECT
(
SELECT
attributed_event_metadata.placement_id
FROM (
SELECT
AS STRUCT attributed_event.placement_id,
ROW_NUMBER() OVER(ORDER BY attributed_event.event_time ASC) AS rank
FROM
UNNEST(t.*_paths.events) AS attributed_event
WHERE
attributed_event.event_type != "FLOODLIGHT"
AND attributed_event.event_time < conversion_event.event_time
AND attributed_event.event_time > (
SELECT
IFNULL( (
SELECT
MAX(prev_conversion_event.event_time) AS event_time
FROM
UNNEST(t.*_paths.events) AS prev_conversion_event
WHERE
prev_conversion_event.event_type = "FLOODLIGHT"
AND prev_conversion_event.event_time < conversion_event.event_time),
0)) ) AS attributed_event_metadata
WHERE
attributed_event_metadata.rank = 1) AS placement_id,
COUNT(*) AS credit
FROM
adh.*_paths AS t,
UNNEST(*_paths.events) AS conversion_event
WHERE
conversion_event.event_type = "FLOODLIGHT"
GROUP BY
placement_id
HAVING
placement_id IS NOT NULL
ORDER BY
credit DESC
【问题讨论】:
【参考方案1】:公平地说,这是一个相当复杂的查询,我想我知道你在问什么,如果不是这样,请纠正我。
比较 prev_conversion_event.event_time
您正在做类似“我想要来自此的所有事件(unnest),并且对于每个事件,我想知道哪些事件是彼此的前身”。
假设您有 [A, B, C, D] 并且它们是连续排序的(A 发生在 B 之前,A 和 B 发生在 C 之前,依此类推),取消嵌套和加入该条件的结果将给你一些类似[A:(NULL), B:(A), C:(A, B), D:(A, B, C)]
的东西(请原谅符号,希望它不会混淆),作为每个键:值对,事件:(前身)。请注意,A 之前没有事件,但 B 有 A,等等。
现在您有一个漂亮的表格,其中包含所有转换事件以及在该事件之前发生的事件。
【讨论】:
嗨@Francesco!非常感谢您的回复!这有帮助,但我仍然不太确定你提到的结果是如何产生的。在示例数据中,据我了解,prev_conversion_event.event_time
是 7 个整数(event_time)的列表,conversion_event.event_time
也是如此。比较 2 个相同的整数列表如何生成您提到的表格?我肯定在某个地方错了,但不知道如何纠正自己。
嗯,它不是马上的。 UNNESTING 将扇出嵌套元素的所有成员,但随后 WHERE 条件将使只有符合逻辑的成员(我共享的那个)才会显示在最终查询中。试着用一张纸从最里面的查询和外面的查询中找出这个,评估每个子查询应该是什么样子,这样会更清楚。 (或者在 BigQuery 中单独运行子查询,任何适合您的方式)以上是关于带有 unnest 的嵌套 SQL 评估问题的主要内容,如果未能解决你的问题,请参考以下文章
Google BigQuery:UNNEST 结构数组和未嵌套项作为结构
递归地将`unnest_wider()`应用于所有列,直到没有更多的嵌套列表列?
PostgreSQL unnest,嵌套字段特定元素的 WHERE 子句