sql - 在 X 个不同日期玩过的用户 - SQL Standard + BigQuery
问题描述
我在带有 SQL 标准的 BigQuery 上有以下数据模型架构(我只有架构,没有表)。
我创建了这个查询来选择过去三个月在 Love 游戏中产生更多收入的前 10 名用户:
SELECT
users.user_id,
SUM(pay.amount) AS total_rev
FROM
`my-database.User` AS users
INNER JOIN
`my-database.IAP_events` AS pay
ON
users.User_id = pay.User_id
INNER JOIN
`my-database.Games` AS games
ON
users.Game_id = games.Game_id
WHERE
games.game_name = "Love"
GROUP BY
users.user_id
ORDER BY
total_rev ASC
LIMIT
10
但随后,该练习表示仅考虑在过去 3 个月内玩过 10 天不同游戏的用户。我知道我会在日期中使用带有计数的子查询,但我对如何做到这一点有点迷失......
非常感谢!
解决方案
编辑:您需要计算不同的日期,而不是交易,因此在限定条款中您需要声明COUNT(DISTINCT date_) OVER ...
而不是COUNT(transaction_id) OVER ...
. 已经修复了代码。
据我了解,您需要在前 3 个月的窗口中计算 IAP_Events 内的不同 transaction_id,检查该计数是否大于 10,然后将该约束中包含的所有用户的数量相加。
为此,您可以使用BigQuery 的分析函数,也就是窗口函数:
with window_counting as (
select
user_id,
amount
from
iap_events
where
date_ >= date_sub(current_date(), interval 3 month)
qualify
count(distinct date_) over (partition by user_id) > 10
),
final as (
select
user_id,
sum(amount)
from
window_counting
group by
1
order by
2 desc
limit 10
)
select * from final
您只需要在第一个 CTE 中添加所需的连接,以便按 game_name 过滤:)
推荐阅读
- debian - 未创建 freeswitch 网关
- python - 我想知道如何制作while循环?
- scala - 无法重新定义组件。ID:org.scala-sbt-compiler-bridge_2.12-1.3.5-bin_2.12.11__52.0
- java - java.lang.NullPointerException 在 Spring JPA 中使用 @Query 从 db 获取数据。虽然查询在 MySql 中返回数据
- java - 使用 fab 调用日期选择器对话框时出错
- android - 获取纬度和经度的数量
- python-3.x - 如何使用小数在变量中的分隔符后设置和保留 2 位数字?
- javascript - 数据表和分页和行选择问题
- windows - git-bash 生成默认的 .bashrc
- asp.net - 会话变量在来自另一个提供者的回调中丢失