Sql 关于在bigquery中基于2个值对数据集进行排序的问题
大家好!stackoverflow的新特性。在BigQuery中,RANK()在(按…分区)上有问题 下表有3列。时间戳、代码和用户id。我希望能够对它们进行排序,因此对于每个代码,当有新的用户id时,应该将其作为新值计算Sql 关于在bigquery中基于2个值对数据集进行排序的问题,sql,count,google-bigquery,distinct,rank,Sql,Count,Google Bigquery,Distinct,Rank,大家好!stackoverflow的新特性。在BigQuery中,RANK()在(按…分区)上有问题 下表有3列。时间戳、代码和用户id。我希望能够对它们进行排序,因此对于每个代码,当有新的用户id时,应该将其作为新值计算 rank timestamp Codes user_id 1 2020-08-21 17:13:37.457 UTC XF7RNCNT4HF7XT JR3k3LODRHHG 2
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进行两次计数。如果要根据用户id的第一次出现对其进行计数,请获取最小时间戳,并将其与densite\u rank()
一起使用:
我知道您只想在每个代码首次出现日期对每个用户统计一次。下面是使用窗口函数的一种方法:
select t.*, countif(rn = 1) over(partition by code order by timestamp) rnk
from (
select t.*, row_number() over(partition by code, user_id order by timestamp) rn
from mytable t
) t
逻辑是按照增加的时间戳枚举每个用户和代码的行。然后,我们可以只计算外部查询中每个组的第一行。如果用户id更改回代码上的前一个vlue,会发生什么。
select t.*, countif(rn = 1) over(partition by code order by timestamp) rnk
from (
select t.*, row_number() over(partition by code, user_id order by timestamp) rn
from mytable t
) t