Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于在bigquery中基于2个值对数据集进行排序的问题_Sql_Count_Google Bigquery_Distinct_Rank - Fatal编程技术网

Sql 关于在bigquery中基于2个值对数据集进行排序的问题

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

大家好!stackoverflow的新特性。在BigQuery中,RANK()在(按…分区)上有问题

下表有3列。时间戳、代码和用户id。我希望能够对它们进行排序,因此对于每个代码,当有新的用户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进行两次计数。如果要根据用户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