1

我正在使用#standardsqlin bigquery 并尝试将每个 customer_id 的 maksimum 排名编码为1,其余部分是0

这是目前的查询结果

排名 customer_id

排名查询是这样的

ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY booking_date Asc) as ranking

我需要的是创建另一个像这样的列,它将每个的最大排名解码customerid为 1,并且它下面的数字0就像下表一样

在此处输入图像描述

谢谢

4

2 回答 2

1

我们可以包装您当前的查询,然后将MAX其用作分析函数,并按客户进行分区,以将每个ranking值与每个客户的最大值ranking进行比较。当该ranking值等于客户的最大值时,我们为 分配 1 custom_coded,否则我们分配 0。

SELECT
    customer_id, item_bought, booking_date, ranking,
    CASE WHEN ranking = MAX(ranking) OVER (PARTITION BY customer_id)
         THEN 1 ELSE 0 END AS custom_coded
FROM
(
    SELECT customer_id, item_bought, booking_date,
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY booking_date) ranking
    FROM yourTable
) t;
于 2017-11-28T11:28:18.200 回答
1

根据您的样本数据,您的排名是不稳定的,因为您有多行具有相同的键值。无论如何,您仍然可以在没有子查询的情况下做您想做的事,只需使用case

select t.*,
       row_number() over (partition by customer_id order by booking_date asc) as ranking,
       (case when row_number() over (partition by customer_id order by booking_date asc) =
                  count(*) over (partition by customer_id)
             then 1 else 0
        end) as custom_coded
from t;

做同样事情的更传统的方法是使用降序排序:

select t.*,
       row_number() over (partition by customer_id order by booking_date asc) as ranking,
       (case when row_number() over (partition by customer_id order by booking_date desc) = 1
             then 1 else 0
        end) as custom_coded
from t;
于 2017-11-28T11:37:41.170 回答