【问题标题】:Constructing new table by aggregating values in one table通过在一个表中聚合值来构造新表
【发布时间】:2020-09-01 20:51:52
【问题描述】:

我想根据一个表中看到的数据生成另一个表。

Customer  product_1      product_2     product_3
  cust_1    0               1            0
  cust_2    1               1            0
  cust_3    1               1            1

我有兴趣计算每种产品的购买率。

例如,product_1 的购买率是

(count of (where product_1 = 1)/(count of (where product_1 = 0) + count of (where product_1 = 1))) * 100 

assuming 1 = purchase, 0 = no purchase

i.e. 2/3 * 100 = 66.67

输出表应该如下-

 Products       Purchased_quantity      Not_purchased_quantity      Purchase_rate
product_1               2                        1                       66.67
product_2               3                        0                       100
product_3               1                        2                       33.33

【问题讨论】:

    标签: sql google-bigquery unpivot


    【解决方案1】:

    以下适用于 BigQuery 标准 SQL,不需要硬编码名称,而是动态执行 - 适用于任何 [合理] 数量的产品列...

    #standardSQL
    SELECT product,
      SUM(purchase) AS Purchased_quantity,
      SUM(1 - purchase) AS Not_purchased_quantity, 
      ROUND(100 * AVG(purchase), 2) AS Purchase_rate
    FROM (
      SELECT 
        SPLIT(kv, ':')[OFFSET(0)] product,
        CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) purchase
      FROM `project.dataset.table` t,
      UNNEST(SPLIT(REPLACE(TRIM(TO_JSON_STRING(t), '{}'), '"', ''))) kv
      WHERE SPLIT(kv, ':')[OFFSET(0)] != 'Customer'
    )
    GROUP BY product   
    

    如果应用于来自我们问题的样本数据 - 输出是

    Row product     Purchased_quantity  Not_purchased_quantity  Purchase_rate    
    1   product_1   2                   1                       66.67    
    2   product_2   3                   0                       100.0    
    3   product_3   1                   2                       33.33   
    

    【讨论】:

      【解决方案2】:

      您想要反透视和聚合。这是一种方法:

      select product, sum(quantity), sum(1 - quantity),
             avg(quantity)
      from ((select 'product1' as product, product1 as quantity from t) union all
            (select 'product2' as product, product2 as quantity from t) union all
            (select 'product3' as product, product3 as quantity from t) 
           ) p
      group by product;
      

      这假设列只有 0 和 1 —— 可能比数量更恰当地称为标志。

      【讨论】:

      • 有没有办法自动化联合所有语句?我在原始数据中有很多 product_x 列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多