【问题标题】:Using COUNTIF inside aggregation function在聚合函数中使用 COUNTIF
【发布时间】:2020-12-25 03:09:56
【问题描述】:

我正在制作一个投注系统应用程序。我需要根据用户的投注来计算用户的分数,因为我知道有些投注可以“组合”,这使得计算比简单的加法复杂一些。

所以如果我有 3 个赌注:{points: 3, combined: false}, {points: 5, combine: true}, {points: 10, combine: true},则有 两个赌注在这里合并,所以总分应该是 3 + (5 * 2) + (10 * 2)。 现实有点复杂,因为分数并不直接在投注对象中,而是在它所指的比赛中

这是我的查询的一部分。如您所见,我首先根据匹配结果检查下注是否正确,在这种情况下,如果下注被组合,我将其乘以组合长度的值,否则我将只计算该下注的值。我试图在 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

我已经找了好几天了...非常感谢您的帮助!

【问题讨论】:

标签: sql count google-bigquery sum window-functions


【解决方案1】:

如果我没听错,那么您需要使用窗口函数计算子查询中每个用户的组合投注总数。然后,您可以在汇总时使用此信息。

考虑:

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,
            json_extract_scalar(data, '$.value')     value,
            json_extract_scalar(data, '$.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 提取移到子查询中以减少查询的长度。

【讨论】:

  • 这看起来是一个优雅的解决方案 :) 我最终做了一些不同的事情,通过创建另一个“表”(使用 WITH)来组织我的组合数据并计算我的分数。我不知道我可以用 OVER 和 PARTITION BY 实现同样的目标。很高兴知道!抱歉回复晚了!
猜你喜欢
  • 2010-10-09
  • 2014-09-19
  • 2023-01-15
  • 2015-01-10
  • 2016-05-24
  • 2023-03-15
  • 2019-10-04
  • 2016-11-04
  • 2020-01-03
相关资源
最近更新 更多