sql - 关于根据 bigquery 中的 2 个值对数据集进行排名的问题
问题描述
大家好!stackoverflow 的新手。我在 BigQuery 中遇到 RANK()OVER (PARTITION BY... 的问题。
下表有 3 列。时间戳、代码和 User_id。我希望能够为每个代码对这些进行排名,当有一个新的 user_id 时,它应该将其计为一个新值。
rank timestamp Codes user_id
1 2020-08-21 17:13:37.457 UTC XF7RNCNT4HF7XT JR3k3LODRHHG
2 2020-08-24 01:39:21.625 UTC XF7RNCNT4HF7XT 26a02014-20ae-43b6-b491-bd7292a143c4
2 2020-08-24 01:39:56.815 UTC XF7RNCNT4HF7XT 26a02014-20ae-43b6-b491-bd7292a143c4
3 2020-08-26 21:30:47.215 UTC XF7RNCNT4HF7XT PC1795338
4 2020-08-29 18:54:48.032 UTC XF7RNCNT4HF7XT PC9602007
解决方案
嗯。. . 我认为您可以使用lag()
和累积总和:
select t.*,
sum(case when prev_code = code then 0 else 1 end) over (partition by code order by timestamp) as ranking
from (select t.*,
lag(user_id) over (partition by code order by timestamp) as prev_code
from t
) t;
如果一个代码出现多次(由其他用户 id 分隔),上面将计算一个用户 id 两次。如果您想根据第一次出现来计算用户 id,则获取最小时间戳并将其用于dense_rank()
:
select t.*,
dense_rank() over (partition by code order by min_timestamp) as ranking
from (select t.*,
min(timestamp) over (partition by code, user) as min_timestamp
from t
) t;
推荐阅读
- android-ndk - 运行 gradlew 命令时如何设置 ndk 目录
- reactjs - 更改 react-flatpickr 库上的日期格式?
- r - 在带有 pdf 输出的 Rmarkdown 中同时使用英语和希腊语会产生冲突
- javascript - 使用 Promise.all 为 AWS Node.js 上传创建进度条
- matlab - pcolor 基本上是如何工作的?请帮助我理解 pcolor、颜色矩阵和颜色映射工作
- python - 如何有效地进行具有唯一约束的多对多条目
- sql - 查询以返回嵌套 XML 节点的行
- firebase - 如何在小部件中声明“int index”
- c# - WPF 中的自适应卡引发错误“值不能为空参数名称:键”
- android - Gradle错误:统一android构建中的冲突属性