PostgreSQL根据用户输入计算加权平均值

PostgreSQL根据用户输入计算加权平均值,postgresql,Postgresql,我有一个分数表,列出了每部电影和评论家的分数,评论家给那部电影的分数:(电影id,评论家id,分数)。我通过以下PostgreSQL查询,在给定的一系列评论家中找到平均得分最高的10部电影: SELECT f_id, avg(f_score) FROM ( SELECT s.film_id as f_id, s.critic_id as c_id, s.score as f_score FROM

我有一个分数表,列出了每部电影和评论家的分数,评论家给那部电影的分数:(电影id,评论家id,分数)。我通过以下PostgreSQL查询,在给定的一系列评论家中找到平均得分最高的10部电影:

SELECT 
    f_id, avg(f_score) 
FROM 
    (
        SELECT 
            s.film_id as f_id, s.critic_id as c_id, s.score as f_score 
        FROM 
            score s
        WHERE 
            s.critic_id = ANY(ARRAY['CRITIC_BOB_0213', 'CRITIC_AMY_9671']) 
        GROUP BY 
            s.film_id, s.critic_id, s.score  
    ) 
sub 
GROUP BY 
    f_id 
ORDER BY 
    avg desc 
LIMIT 
    10;
在这种情况下,用户会说他想知道评论家Bob和Amy的分数,然后返回:

f_id     | avg
"742545"   13.0330650266333
"220176"   6.7783259974
"662682"   6.52305498088333
...
现在,我希望用户能够给予某个评论家一定的权重。 因此,基本上,用户输入
[('CRITIC_BOB_0213',0.923),('CRITIC_AMY_9671',0.212)]
(例如,如果他更看重BOB的判断而不是AMY的),我需要查询来反映这一点。所以你会得到一个加权平均值:
avg(score\u bob*0.923+score\u amy*0.212)
。我需要它在查询本身,电影的数量是在数百万,我不想在计算我的后端代码的加权平均数之前返回它们


这在PostgreSQL中是可能的吗?

通过以下操作自己解决了这个问题:

SELECT 
    f_id, avg(weighted_score)
FROM 
    (
        SELECT 
            s.film_id as f_id
        ,
        CASE
            WHEN s.critic_id='CRITIC_BOB_0213' THEN s.score*CRITIC_BOB_WEIGHT
            WHEN s.critic_id='CRITIC_AMY_9671' THEN s.score*CRITIC_AMY_WEIGHT
            ELSE -1
        END as weighted_score 
        FROM 
            score s
        WHERE 
            s.critic_id = ANY(ARRAY['CRITIC_BOB_0213', 'CRITIC_AMY_9671']) 
        GROUP BY 
            s.film_id, s.critic_id
    ) 
sub 
GROUP BY 
    f_id
ORDER BY 
    avg desc 
LIMIT 
    10;

希望它将来能帮助别人。

我自己通过以下方式解决了这个问题:

SELECT 
    f_id, avg(weighted_score)
FROM 
    (
        SELECT 
            s.film_id as f_id
        ,
        CASE
            WHEN s.critic_id='CRITIC_BOB_0213' THEN s.score*CRITIC_BOB_WEIGHT
            WHEN s.critic_id='CRITIC_AMY_9671' THEN s.score*CRITIC_AMY_WEIGHT
            ELSE -1
        END as weighted_score 
        FROM 
            score s
        WHERE 
            s.critic_id = ANY(ARRAY['CRITIC_BOB_0213', 'CRITIC_AMY_9671']) 
        GROUP BY 
            s.film_id, s.critic_id
    ) 
sub 
GROUP BY 
    f_id
ORDER BY 
    avg desc 
LIMIT 
    10;

希望它能在将来帮助其他人。

批评家\u BOB\u WEIGHT
是表中的字段还是变量?它是用户作为输入提供的变量。在我的后端代码中,我只有一个循环来构造查询,该查询在用户输入上循环,并在必要时使用此变量添加
行。。。我假设用户可以提供任意数量的评论和权重,您希望查询能够处理它?为什么它不能扩展?
大小写表达式是否不够快?如果它在
行时增长到100,这有关系吗?我当然愿意接受其他的解决方案。是的,没错。。。这不是一个足够快的问题。我毫不怀疑这将有效地执行。只是构建动态SQL的整个想法总是让我问是否有更好的方法。我无意批评这个解决方案。毕竟,这是你的问题,你可能是决定哪种解决方案最有效的最佳人选。不仅如此,目前我没有更好的建议。
CRITIC\u BOB\u WEIGHT
是表中的一个字段还是一个变量?它是用户输入的变量。在我的后端代码中,我只有一个循环来构造查询,该查询在用户输入上循环,并在必要时使用此变量添加
行。。。我假设用户可以提供任意数量的评论和权重,您希望查询能够处理它?为什么它不能扩展?
大小写表达式是否不够快?如果它在
行时增长到100,这有关系吗?我当然愿意接受其他的解决方案。是的,没错。。。这不是一个足够快的问题。我毫不怀疑这将有效地执行。只是构建动态SQL的整个想法总是让我问是否有更好的方法。我无意批评这个解决方案。毕竟,这是你的问题,你可能是决定哪种解决方案最有效的最佳人选。不仅如此,目前我没有更好的建议。