按 id sql 计算属性率

calculate rate of attribute by id sql

首先,这是我的 table 架构:

order_id, product_id, add_to_cart_order, reordered

我的问题是计算产品的重新订购率。所以我们可以看到"add_to_cart_order"是没用的,不知道对于"order_id"。 "reordered" 可以有 '1' 和 '0' 值。

目前,我可以通过 product_id 和

得到 "reordored" 的计数
SELECT 
    product_id, 
    COUNT(reordered) 
FROM 
    train 
WHERE
    reordered = '1' 
GROUP BY 
    product_id;

以及具有

的产品的出现次数
SELECT 
    product_id, COUNT(*) 
FROM
    train  
GROUP BY 
    product_id;

我试过了

SELECT 
    t1.product_id, 
    COUNT(t1.product_id) / (SELECT COUNT(reordered) 
                            FROM train t2 
                            WHERE t2.reordered = '1' 
                              AND t1.product_id = t2.product_id 
                            GROUP BY product_id) 
FROM
    train t1 
GROUP BY
    t1.product_id;

但是太费时间了(我不知道这个请求是否正确,因为我还没有结果)

这是您要找的吗?

SELECT Product_id, SUM(CASE WHEN reordered=1 THEN 1 ELSE 0 END ) /
COUNT(*) AS ReorderedRate
FROM
train
GROUP BY Product_id

这将为每个 product_id 计算: 列车中的线路数 cnt_prod 火车 cnt_prod_reorder 中重新排序的行数

SELECT t1.product_id, COUNT(t1.product_id) as cnt_prd,
                      COUNT(case when t.1.reordered='1' then  1 else NULL end ) as cnt_prd_reord 
from train t1 group by t1.product_id;

所以之后你可以做:

select st.product_id , st.cnt_prd , st.cnt_prd / st.cnt_prd_reord
from (
     SELECT t1.product_id, COUNT(t1.product_id) as cnt_prd,
                           COUNT(case when t.1.reordered='1' then  1 else NULL end   ) as cnt_prd_reord 
     from train t1 group by t1.product_id 
) as st ;

试试这个优雅的

SELECT t1.product_id, SUM(CASE WHEN reordered = 1 THEN 1 ELSE 0 END) / COUNT(t1.product_id)
FROM train t1 
GROUP BY t1.product_id;

我认为最简单的方法是使用AVG():

SELECT product_id, 
       AVG(CASE WHEN reordered = '1' THEN 1.0 ELSE 0 END) 
FROM train 
GROUP BY product_id;

如果 reordered 确实是一个只取值 01 的数字,那么您可以进一步简化为:

SELECT product_id, AVG(reordered)
FROM train 
GROUP BY product_id;

或:

SELECT product_id, AVG(reordered * 1.0)
FROM train 
GROUP BY product_id;

在将整数的平均值作为整数返回的数据库中需要第二个。