SQL查询数学体操

Posted

技术标签:

【中文标题】SQL查询数学体操【英文标题】:SQL Query Math Gymnastics 【发布时间】:2010-04-22 16:50:22 【问题描述】:

我在这里关注两个表:users 和race_weeks。 User 有很多race_weeks,race_week 属于User。因此,user_id 是race_weeks 表中的一个fk。

我需要对 race_weeks 表中的字段执行一些具有挑战性的数学运算,以便返回具有最多历史记录的用户。

这是我们需要在race_weeks 表中操作的字段。

races_won (int)
races_lost (int)
races_tied (int)
points_won (int, pos or neg)
recordable_type(varchar, Robots can race, but we're only concerned about type 'User')

只是为了让您充分了解这里工作的业务逻辑,用户可以在一周内参加许多比赛。 race_week 记录代表该周用户比赛的汇总结果。如果races_won、races_lost 或races_tied 大于0,则认为用户在一周内处于活跃状态。否则用户处于非活跃状态。

因此,我们需要在查询中执行以下操作,以返回获得最多积分的用户(实际上是 net_points_won):

    计算每个用户的 net_points_won(不是数据库中的字段)。

    要计算 net_points_won,您需要 (1000 * count_of_active_weeks) - sum(points__won)。 (为什么是 1000?试想一下,每周发现用户有 1000 分来参加比赛和参加比赛。我们想要考虑我们发现用户的因素,因为用户一周只能参加一场比赛以获得 100 分,并且是坐在 900 分上,我们会歪曲谁实际上获得了最高分。)

这个有点复杂,如果我能进一步澄清,请告诉我。

【问题讨论】:

在尝试解决之前,请先查看我的 cmets 到 Quassnoi。 【参考方案1】:

我认为您的业务逻辑不正确:net_points 应该是该用户赢得的积分减去该用户被发现的积分数。

此外,活动周检查应针对零显式测试races_wonraces_lostraces_tied,以使系统有机会在表变大时对这些列使用索引。

SELECT user_id
     , SUM(points_won) - 1000 * COUNT(*) AS net_points
  FROM race_weeks
 WHERE recordable_type = 'User'
   AND (races_won > 0 OR races_lost > 0 OR races_tied > 0)
 GROUP BY user_id
 ORDER BY net_points DESC

【讨论】:

【参考方案2】:
SELECT  user_id, 1000 * COUNT(*) - SUM(points_won) AS net_points
FROM    race_weeks
WHERE   races_won + races_lost + races_tied
        AND recordable_type = 'User'
GROUP BY
        user_id
ORDER BY
        net_points DESC

【讨论】:

如果用户在给定的一周内没有参加比赛,仍然会在race_week 表中创建一条记录。但是,races_won = 0、races_lost = 0 和races_tied = 0。这就是我们可以判断用户是否处于非活动状态的方法。所以我们不能计算所有的race_week记录。我们只能计算活跃的。 @keruilin:我将机器人测试添加到WHERE 条件中。至于活跃用户,races_won + races_lost + races_tiedmysqlraces_won + races_lost + races_tied <> 0的快捷方式,所以只会选择活跃用户。

以上是关于SQL查询数学体操的主要内容,如果未能解决你的问题,请参考以下文章

SQL去重复查询

MySQL中包含数学比较的SQL查询

在sql数据库里的,查询分析器里,有很多数学函数,但不知哪些参数是必输的,怎么样才知道呢?

sql 语句编写 查询参加全部科目考试的学生及其成绩 201601 张三 语文 82

SQL,嵌套查询(MS ACCESS)

sql 一对多查询