[英]calculate rate of attribute by id sql
首先,这是我的表架构:
order_id, product_id, add_to_cart_order, reordered
我的问题是计算产品的重新订购率。 所以我们可以看到“add_to_cart_order”没有用,我不知道“order_id”。 “重新排序”可以有“1”和“0”值。
目前,我可以通过 product_id 计算“重新排序”的数量
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
试试这个优雅的
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 确实是一个仅取值0
和1
,那么您可以进一步将其简化为:
SELECT product_id, AVG(reordered)
FROM train
GROUP BY product_id;
或者:
SELECT product_id, AVG(reordered * 1.0)
FROM train
GROUP BY product_id;
在将整数的平均值作为整数返回的数据库中需要第二个。
这将为每个product_id
计算:train 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 ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.