如何解决在聚合函数中使用COUNTIF
我正在制作一个投注系统应用程序。我需要根据用户的投注来计算他的积分,因为知道某些投注可以“组合”,这使得计算比简单的加法更加复杂。
因此,如果我有3个下注:{点:3,合并:假},{点:5,合并:真},{点:10,合并:真},则有两个此处合并投注,因此总分应为3 +(5 * 2 )+(10 * 2 )。 现实有点复杂,因为这些点并不直接在投注对象中,而是在比赛中它指的是
这是我查询的一部分。如您所见,我首先根据比赛结果检查赌注是否正确,在这种情况下,如果将赌注合并,则将其乘以CombinedLength的值,否则我将对该赌注的值求和。我试图在CASE中复制COUNTIF,这给了我类似“无法在聚合中聚合”的错误。
SELECT
JSON_EXTRACT_SCALAR(data,'$.userId') AS userId,COUNTIF(JSON_EXTRACT_SCALAR(data,'$.combined') = 'true') AS combinedLength,SUM (
(
CASE WHEN JSON_EXTRACT_SCALAR(data,'$.value') = match.result
THEN IF(JSON_EXTRACT_SCALAR(data,'$.combined') = "true",match.odd * combinedLength,match.odd)
ELSE 0
END
)
) AS totalScore,FROM data.user_bets_raw_latest
INNER JOIN matchLines ON matchLines.match.matchId = JSON_EXTRACT(data,'$.fixtureId')
GROUP BY userId
我一直在找几天...非常感谢您的帮助!
解决方法
如果我正确地遵循了您的说明,那么您需要使用窗口函数来计算子查询中每个用户的合并投注总数。然后,您可以在汇总时使用此信息。
考虑:
select
user_id,sum(case when combined = 'true' then odd * cnt_combined else odd end) total_score
from (
select
u.*,m.match.odd,countif(b.combined = 'true') over(partition by userid) as cnt_combined,from (
select
json_extract_scalar(data,'$.userid') userid,json_extract_scalar(data,'$.combined') combined,'$.value') value,'$.fixtureid') fixtureid
from data.user_bets_raw_latest
) b
left join matchlines m
on m.match.matchid = b.fixtureid
and m.match.result = b.value
) t
group by userid
我发现使用left join
并将条件放在匹配结果上更为简单。
我将json提取内容移到了子查询中,以缩短查询的时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。