Sql 获取每个阶段中每个合计金额的最大值

Sql 获取每个阶段中每个合计金额的最大值,sql,sql-server,group-by,sum,max,Sql,Sql Server,Group By,Sum,Max,我已经搜索了这个网站和其他网站,但找不到确切的例子,我在寻找什么。 基本上,我有一个游戏表(精确地说是运动),需要按用户和阶段求和,然后得到每个阶段的最大值 这是我的桌子: Game_Score_User(GameId, UsrRegId, Stage, Score) -- Primary key is (GameId, UsrRegId, Stage) 现在,我有不同的GameId,但我只按一个进行过滤 然后,对于这场比赛(本例中为篮球),您可以在某个阶段进行几场比赛。假设一个舞台在两天内播

我已经搜索了这个网站和其他网站,但找不到确切的例子,我在寻找什么。 基本上,我有一个游戏表(精确地说是运动),需要按用户和阶段求和,然后得到每个阶段的最大值

这是我的桌子:

Game_Score_User(GameId, UsrRegId, Stage, Score)
-- Primary key is (GameId, UsrRegId, Stage)
现在,我有不同的GameId,但我只按一个进行过滤

然后,对于这场比赛(本例中为篮球),您可以在某个阶段进行几场比赛。假设一个舞台在两天内播放(所以日期不重要),其中有6场比赛。您的用户将在比赛开始前输入他们的预测。然后,根据他们成功或失败的预测,他们将获得一些分数。(这是由一个程序完成的,但我想解释一下这个表的用途)

好的,现在我们有了每个用户在某个阶段的分数。因此,如果我们有用户200和用户240,他们可能有这些阶段的分数(取决于他们是否预测了该阶段内的任何游戏,否则,他们将分别获得该比赛或阶段的分数=0)

我的理解是,由于无法计算MAX(SUM()),因此需要在查询中求解SUM,然后为其分配别名,这样就可以像处理实际表一样处理它,然后从该“表”中为所需字段请求MAX()值,并按正确的字段分组

我猜我在子查询中按不必要的值分组,但是。。。如果在别名为“table”的子查询中未包含这些属性,则无法从“external”或“main”查询中引用这些属性。我是莱特吗?我这样说是因为我得到一个错误,告诉我这些属性在这种情况下不存在

我正在使用SQLServer2008

底线是我需要从一个查询中获得GameId、UsrRegId、Stage和累积分数,该查询应该告诉我谁赢得了每个阶段

到目前为止,我尝试的是下面的查询,但它只给我增加的分数,而不是每个阶段的最大值。也就是说,它只告诉我每个阶段和用户的总数,而不是告诉我“这个阶段是这个用户赢的”:


好的,让我们备份一下,从子查询开始

SELECT GameId, UsrRegId, Stage, SUM(Points) as Score_User
        FROM Game_Score_User
        WHERE GameId = 280 AND
              Stage IN (SELECT Stage
                        FROM Game_Stages 
                        WHERE GameId = 280)
        GROUP BY GameId, UsrRegId, Stage
(…)中的
阶段实际上不会从子查询中过滤任何内容。它本质上是说游戏ID必须是280,舞台必须来自一个游戏ID为280。如果阶段与gameId不相关,那么它不应该出现在Game_Score_User表中。换句话说,我们不应该让约翰尼打赌,如果史蒂夫和克里斯不在一起玩游戏,史蒂夫会打败克里斯

SELECT GameId, UsrRegId, Stage, SUM(Points) as Score_User
FROM Game_Score_User
WHERE GameId = 280
GROUP BY GameId, UsrRegId, Stage
子查询的这一部分将返回用户总分列表以及与之关联的游戏和阶段。假设此查询返回以下数据:

现在,我们需要将此表筛选到每个阶段的用户得分最高的行。如何实现这一点的问题在于,如果您想要撤回GameID、UsrRegId、Stage和Score_用户,您不能只告诉sql获取最大值(Score_用户)并按所有这些列分组。它将收回我上面列出的相同结果。分组方式将不再有助于解决问题,因为所有数据都已正确分组

不幸的是,真正做到这一点的唯一方法是使用自联接,我们将不得不再次聚合总和,以确保我们正在查看的行是最大值。有几种方法可以做到这一点,我个人更喜欢不存在自联接

SELECT JPU.GameId, JPU.UsrRegId, JPU.Stage, JPU.Score_User as Winner_Score
FROM (SELECT GameId, UsrRegId, Stage, SUM(Points) as Score_User
        FROM Game_Score_User gsu
        WHERE GameId = 280
        GROUP BY GameId, UsrRegId, Stage) gsu
Where not exists (Select *
                    From Game_Score_User gsu2
                    WHERE GameId = 280
                    and gsu2.Stage = gsu.Stage
                    GROUP BY GameId, UsrRegId, Stage
                    Having sum(gsu2.points) > gsu.Score_User)
not exists确保没有任何分数大于当前行。having是一种比较聚合函数的方法,在本例中,我使用它来检查gameid和stage的其他分数总和。not exists仅在结果表为空时返回true。此查询应导致:


在阅读完你的文字墙之后,听起来你所需要做的就是从中选择排名前1的JPU.GameId,JPU.Score\u用户作为赢家。。。然后删除组BY并替换为ORDER BY JPU.Score\u User DESC?谢谢你们两位。对于@RichardHansell,这并不是我想要的,这么长的问题都是我的错,所以我会按照乔治·斯托克的要求重新措辞。我将用集合论来解释:我有一系列的阶段。在每个阶段中,我有几个用户,他们预测的每一场比赛的分数。所以我需要得到每个阶段每个用户的总分。然后,我需要比较每个用户的分数,以获得每个阶段的最大分数。“我应该结束每个阶段的优胜者用户的状态。@GeorgeStocker,请让我知道我的问题现在是否更容易理解。“我试图尽可能详细地解释我的想法,但同时,不要用一种听起来很复杂的方式来解释。”哈维尔向你解释,仍然留下一个可以理解的问题。好吧,让我再试一次。我有4列很重要:GameId、UserId、Stage、Score。我试图获得的是在每个阶段为每个用户赢得的分数。然后,根据这些结果,获得每个阶段的最高得分,从而知道谁是赢得该阶段的用户。我分两步来描述它,因为我认为它应该被解决。也许因为这个,我把每个人都弄糊涂了。太棒了@Jenn!!这正是我想要的。我尝试重新分组数据时真的错了,现在我明白了为什么我总是以“分离”数据结束,而不是最终“总结”所有内容,以获得每个阶段的赢家。我必须读你的解释三遍才能理解这些概念,因为我的弱点是这种操作。你可以认为这个问题已经解决了。谢谢大家!!
GameID | UsrRegID | Stage | Score_User
280    | 1        | 1     | 20
280    | 1        | 3     | 4
280    | 2        | 1     | 15
280    | 2        | 2     | 15
280    | 2        | 3     | 15
280    | 3        | 2     | 25
280    | 4        | 1     | 17
280    | 4        | 3     | 12
SELECT JPU.GameId, JPU.UsrRegId, JPU.Stage, JPU.Score_User as Winner_Score
FROM (SELECT GameId, UsrRegId, Stage, SUM(Points) as Score_User
        FROM Game_Score_User gsu
        WHERE GameId = 280
        GROUP BY GameId, UsrRegId, Stage) gsu
Where not exists (Select *
                    From Game_Score_User gsu2
                    WHERE GameId = 280
                    and gsu2.Stage = gsu.Stage
                    GROUP BY GameId, UsrRegId, Stage
                    Having sum(gsu2.points) > gsu.Score_User)
GameID | UsrRegID | Stage | Score_User
280    | 1        | 1     | 20
280    | 2        | 3     | 15
280    | 3        | 2     | 25