【发布时间】:2019-12-05 14:42:26
【问题描述】:
我有一个表,其中的行从不变异,而只是插入;它们是不可变的记录。它有以下字段:
-
id:int -
user_id:int -
created:datetime -
is_cool:boolean -
likes_fruits:boolean
对象与用户相关联,给定用户的“当前”对象是具有最新created 日期的对象。例如。如果我想为用户更新is_cool,我会附加一条带有新created时间戳和is_cool=true的记录。
我想计算每天结束时有多少用户is_cool。 IE。我希望输出表有列:
-
day:某种date_trunc('day', created) -
cool_users_count:在这一天结束时拥有is_cool的用户数量。
我可以编写什么 SQL 查询来做到这一点? FWIW 我正在使用 Presto(或 Redshift,如果需要)。
请注意,还有其他列,例如likes_fruits,这意味着 is_cool 是 false 的记录并不意味着 is_cool 只是更改为 false - 它可能有一段时间是 false。
这是过程伪代码的样子,代表我想在 SQL 中做的事情:
// rows = ...
min_date = min([row.created for row in rows])
max_date = max([row.created for row in rows])
counts_by_day = {}
for date in range(min_date, max_date):
rows_up_until_date = [row for row in rows if row.created <= date]
latest_row_by_user = rows_up_until_date.reduce(
{},
(acc, row) => acc[row.user_id] = row,
)
counts_by_day[date] = latest_row_by_user.filter(row => row.is_cool).length
【问题讨论】: