我需要计算userId 列表的平均分数。
我有一张桌子user_place_score
:
(user_id, place_id, score)
有时我没有分数((user_id,place_id)
表中没有行),所以我需要从表中获取“默认”分数default_place_score
:
(place_id, score)
在 PostgreSQL 中是否可以在一个查询中执行此操作?对于给定的用户列表和一个 place_id
,选择他们在 中的所有分数,user_place_score
如果没有找到行,则取default_place_score
表中找到的分数?
基本上我想避免做这种事情:
for (Integer userId : userIds) {
score = (query to fetch the score for this userId)
if (score == null)
defaultScore = (query to fetch the default score for this PlaceId)
total = total + defaultScore
}
//return the average
return total/numberOfUser
看起来你需要一个简单的
LEFT JOIN
但添加了注释,它变得有点复杂:您可以使用 COALESCE() .. 它返回传递给它的列表中的第一个非空值..
COALESCE((QUERY TO GET SCORE FOR USERID),(QUERY TO GET DEFAULT SCORE))
编辑
哦-您添加了“列表”要求……然后,请参阅@ypercube 的答案。
编辑2
如果 place_ids 存在于单独的表中,并且它们只存在于您要查询以获得分数的表中(这将被视为“良好的设计决策”),那么您应该将该表包含在您的@ypercube 的答案中使用的查询 .. COALESCE() 在这种情况下应该可以正常工作。
以上取自@ypercube 的回答并进行了编辑。
请尝试以下查询:
COALESCE
函数返回给定列表中的第一个非 NULL 值,因此如果score
fromuser_place_score
不为 NULL,则函数 peaksuser_place_score
。score
,否则它将从 中获取值default_place_score.score
。