用于在另一个 table 中查找最大值的 BigQuery UDF
BigQuery UDF to find max values in another table
我有一些看起来像这样的数据,其中有不同类型的事件列表、事件发生的时间以及事件关联的用户。事件 A 每个用户只发生一次,但事件 B 可以发生多次。
我想把它变成这样:
逻辑如下:
- 我查询 table 以提取每个用户发生事件 A 的时间列表
- 对于每一行,我然后找到事件 B 在事件 A 之前发生的最近时间
第一点很简单,类似于
SELECT User, Time AS Event_A_Time FROM Raw_Data WHERE Event = 'Event A'
我卡住的地方是如何获得第三列。它需要类似于
SELECT MAX(Time) FROM Raw_Data WHERE Time < [Event_A_Time for this user]
我假设我需要为此使用 UDF,但我正在努力解决如何将其融入语法(使用标准 SQL)的问题。感谢任何帮助!
这种计算不需要 UDF。试试这个:
SELECT * EXCEPT(Event_B_Times),
(SELECT MAX(time) FROM UNNEST(Event_B_Times) AS Time
WHERE Time < Event_A_Time) AS Event_B_Time
FROM (
SELECT
User,
MAX(IF(Event = 'Event A', Time, NULL)) AS Event_A_Time,
ARRAY_AGG(IF(Event = 'Event B', Time, NULL) IGNORE NULLS) AS Event_B_Times
FROM Raw_Data
GROUP BY User
);
我有一些看起来像这样的数据,其中有不同类型的事件列表、事件发生的时间以及事件关联的用户。事件 A 每个用户只发生一次,但事件 B 可以发生多次。
我想把它变成这样:
逻辑如下:
- 我查询 table 以提取每个用户发生事件 A 的时间列表
- 对于每一行,我然后找到事件 B 在事件 A 之前发生的最近时间
第一点很简单,类似于
SELECT User, Time AS Event_A_Time FROM Raw_Data WHERE Event = 'Event A'
我卡住的地方是如何获得第三列。它需要类似于
SELECT MAX(Time) FROM Raw_Data WHERE Time < [Event_A_Time for this user]
我假设我需要为此使用 UDF,但我正在努力解决如何将其融入语法(使用标准 SQL)的问题。感谢任何帮助!
这种计算不需要 UDF。试试这个:
SELECT * EXCEPT(Event_B_Times),
(SELECT MAX(time) FROM UNNEST(Event_B_Times) AS Time
WHERE Time < Event_A_Time) AS Event_B_Time
FROM (
SELECT
User,
MAX(IF(Event = 'Event A', Time, NULL)) AS Event_A_Time,
ARRAY_AGG(IF(Event = 'Event B', Time, NULL) IGNORE NULLS) AS Event_B_Times
FROM Raw_Data
GROUP BY User
);