关于根据 bigquery 中的 2 个值对数据集进行排名的问题
Question to do with ranking a data set based on 2 values in bigquery
大家好! Whosebug 的新手。我在 BigQuery 中遇到 RANK()OVER (PARTITION BY... 问题。
下面的 table 有 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;
我了解到您只想在每个代码首次出现时对每个用户计数一次。这是使用 window 函数的一种方法:
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
逻辑是根据递增的时间戳枚举每个用户和代码的行。然后,我们可以只计算外部查询中每组的第一行。
大家好! Whosebug 的新手。我在 BigQuery 中遇到 RANK()OVER (PARTITION BY... 问题。
下面的 table 有 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;
我了解到您只想在每个代码首次出现时对每个用户计数一次。这是使用 window 函数的一种方法:
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
逻辑是根据递增的时间戳枚举每个用户和代码的行。然后,我们可以只计算外部查询中每组的第一行。