【问题标题】:Decode maximum number in rows for sql解码sql的最大行数
【发布时间】:2018-05-11 20:04:46
【问题描述】:

我在 bigquery 中使用#standardsql 并尝试将每个customer_id 的maksimum 排名编码为1,其余为0

这是目前的查询结果

排名查询是这样的

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

我需要创建另一个像这样的列,它将每个 customerid 的最大排名解码为 1,并将其下方的数字解码为 0,如下表所示

谢谢

【问题讨论】:

    标签: sql postgresql google-bigquery window-functions bigquery-standard-sql


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 2011-03-30
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多