分组依据:计算字段返回bigquery中的相应日期

时间:2018-06-27 10:14:18

标签: sql google-bigquery calculated-field

我需要进行用户级别的分析。由于每个用户数据有很多不同的行(与不同的事件相关),因此我需要按用户分组并创建一些代表不同行的计算字段。字段之一是计算自用户上次购买以来的天数(今天-上次购买日期)。我已经尝试了很多不同的代码,也做了很多研究,但是找不到解决方案。

对我来说有意义但不起作用的代码如下:

在声明时使用大小写

SELECT CASE WHEN LAST(tr_orderid <> "") THEN 
DATEDIFF(CURRENT_DATE(),event_date) ELSE NULL END AS recency_lastbooking
FROM df
GROUP BY domain_userid

使用IF语句

SELECT IF(LAST(tr_total > 0), DATEDIFF(CURRENT_DATE(),event_date), NULL) 
AS recency_lastbooking
FROM df
GROUP BY domain_userid

我得到的错误是:表达式'event_date'在GROUP BY列表中不存在

我认为如果我使用LAST(event_date),查询将返回特定用户所有行中的最后日期,而不是返回用户发生购买事件的最后一天。

PS:我可以使用tr_total(总交易)> 0或tr_orderid(交易订单ID)<>“”

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您只需要一个窗口函数:

val arrSchema = df.schema(1).dataType // ArrayType(StructType(StructField(x,DoubleType,true), StructField(y,DoubleType,true)),true)

val emptyArr = udf(() => Seq.empty[Any],arrSchema)

df
.withColumn("arr",when($"arr".isNull,emptyArr()).otherwise($"arr"))
.show()

+---+-----------+
| id|        arr|
+---+-----------+
|  1|[[1.0,2.0]]|
|  2|         []|
+---+-----------+