按 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 确实是一个只取值 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;
在将整数的平均值作为整数返回的数据库中需要第二个。
首先,这是我的 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 确实是一个只取值 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;
在将整数的平均值作为整数返回的数据库中需要第二个。