Postgresql Postgres按用户分组的比率计算

Postgresql Postgres按用户分组的比率计算,postgresql,group-by,Postgresql,Group By,我有一个赌注表和一个名为“状态”的列,它指示是“正确”还是“不正确”。我可以将特定用户的比率计算为: SELECT (SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Correct')::DECIMAL AS correct_guesses, (SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Incorrect')::DECIM

我有一个赌注表和一个名为“状态”的列,它指示是“正确”还是“不正确”。我可以将特定用户的比率计算为:

SELECT 
    (SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Correct')::DECIMAL AS correct_guesses,
    (SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Incorrect')::DECIMAL AS incorrect_guesses,
    CAST((SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Incorrect') AS DECIMAL) AS Ratio;
但如果我尝试按用户分组,它会为所有用户计算相同的值

SELECT
    user_id, accounts_usuario.username, 
    (SELECT COUNT (*) FROM bets_bet WHERE status = 'Correct') AS Corrects,
    (SELECT COUNT (*) FROM bets_bet WHERE status = 'Incorrect') AS Incorrects,
    (SELECT COUNT (*) FROM bets_bet WHERE status = 'Pending') AS Pending,
    --CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
    CAST((SELECT COUNT(*) FROM bets_bet WHERE status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet WHERE status = 'Incorrect') AS DECIMAL) AS Ratio
FROM bets_bet
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;

我怎样才能达到预期的输出

更新 在实现下一个逻辑后,我面临同样的问题:

我已经创建了类SeasonalUser来存储每年的赌注,字段user是用户类id的外键。现在我有了相同的逻辑,但是有3个表,我得到的每个字段的值都相同

-- Calculate the accuracy ratio for every SeasonUser
SELECT
    bet.user_id, usr.username, 
    COUNT(CASE WHEN  status = 'Correct'   THEN  1 END) AS Corrects, 
    COUNT(CASE WHEN  status = 'Incorrect' THEN  1 END) AS Incorrects, 
    COUNT(CASE WHEN  status = 'Pending'   THEN  1 END) AS Pending,    

    CAST(COUNT(CASE WHEN  status = 'Correct' THEN  1 END) AS DECIMAL) / CAST(COUNT(CASE WHEN status = 'Incorrect' THEN 1 END) AS DECIMAL) AS Ratio

FROM bets_bet AS bet
LEFT JOIN accounts_seasonusuario AS s_usr ON bet.user_id = s_usr.id
LEFT JOIN accounts_usuario AS usr ON usr.id = s_usr.user_id
GROUP BY bet.user_id, s_usr.id, usr.username
ORDER BY Ratio DESC, Corrects DESC;
我真的不想按usr.username(用户全局)分组,因为我想要的是每年的比率,但如果我想在返回表
usr.username
中打印真实用户名,这似乎是强制性的

我遗漏了什么?

SQL 1:

SELECT
    user_id, accounts_usuario.username, 
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and status = 'Correct') AS Corrects,
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and status = 'Incorrect') AS Incorrects,
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Pending') AS Pending,
    --CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
    CAST((SELECT COUNT(*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Incorrect') AS DECIMAL) AS Ratio
FROM bets_bet t1 
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;
它将为所有行返回相同的结果,因为您没有指定应该为哪个用户id结果生成。要添加该条件,请如上所示

SQL 2:

SELECT
    user_id, accounts_usuario.username, 
    count(case when  status = 'Correct' then  1 end ), 
    count(case when  status = 'Incorrect' then  1 end ), 
    count(case when  status = 'Pending' then  1 end ),    
    --CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
    count(case when  status = 'Correct' then  1 end ) / count(case when  status = 'Incorrect' then  1 end ) AS Ratio
FROM bets_bet t1 
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;
您只需按查询中所示计算状态即可。

SQL 1:

SELECT
    user_id, accounts_usuario.username, 
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and status = 'Correct') AS Corrects,
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and status = 'Incorrect') AS Incorrects,
    (SELECT COUNT (*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Pending') AS Pending,
    --CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
    CAST((SELECT COUNT(*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet t2 WHERE t1.user_id = t2.user_id and  status = 'Incorrect') AS DECIMAL) AS Ratio
FROM bets_bet t1 
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;
它将为所有行返回相同的结果,因为您没有指定应该为哪个用户id结果生成。要添加该条件,请如上所示

SQL 2:

SELECT
    user_id, accounts_usuario.username, 
    count(case when  status = 'Correct' then  1 end ), 
    count(case when  status = 'Incorrect' then  1 end ), 
    count(case when  status = 'Pending' then  1 end ),    
    --CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
    count(case when  status = 'Correct' then  1 end ) / count(case when  status = 'Incorrect' then  1 end ) AS Ratio
FROM bets_bet t1 
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;

您可以简单地计算状态,如查询中所示。

让我们假设子查询的bets\u bet t2和主查询的bets\u bet t1。添加条件t1.user\u id=t2.user\u id。假设子查询为bets\u bet t2,主查询为bets\u bet t1。添加条件t1.user\u id=t2.user\u id.谢谢!只是缺少演员的陈述,对吗?因此,分区后的比率不是0。如果你觉得需要强制转换,那么你可以添加它。你能看到更新有什么问题吗?只需添加第三个表,但与工作于Two的逻辑相同。如果您希望按年份添加数据,那么也可以在group by中添加year列。谢谢!只是缺少演员的陈述,对吗?因此,分区后的比率不是0。如果你觉得需要强制转换,那么你可以添加它。你能看到更新有什么问题吗?只需添加第三个表,但与使用Two时的逻辑相同。如果您希望按年份添加数据,那么还可以在group by中添加year列。