SQL Update,从一个表中的特定组中选择MIN

时间:2014-03-30 11:02:05

标签: sql sql-server visual-studio-2012 localdb

我是SQL新手。我搜索了一个符合我要求的答案,我会理解已经做了什么 - 我失败了。所以这里: 我正在制作一个能够保存马拉松锦标赛数据的程序。所以我有一个表格StageResults,其中包含以下列:StageNo ParticipantNumber ParticipantGroup Time(如在完整秒的距离时间中因此为int)和Points 一个例子如下:

 - 1|01|M21|500|X
 - 1|22|M21|550|X
 - 1|45|M21|530|X
 - 1|47|F09|600|X
 - 1|09|F09|630|X
 - 2|01|M21|515|X
 - 2|45|M21|520|X

所以我希望每个阶段中每个小组中最快的成员获得1000分。在我的脑后,我觉得,我可以为此写一个单一的查询,我试了好几个小时。 我现在最好的是:

SELECT c1.ParticipantNumber, c1.ParticipantGroup, c1.Time
FROM StageResults AS c1
LEFT JOIN StageResults AS c2 
ON c1.StageNo = c2.StageNo
AND c1.ParticipantGroup = c2.ParticipantGroup
AND c1.Time < c2.Time;

我在INSERT语句下使用了它。没有语法错误但错误,我试图插入一个重复的主键。我认为这可以通过添加GROUP BY语句来解决。所以我还没有真正测试过这个。

我最终希望在每次运行(阶段)和每个组中为最快参与者设置1000个点(我的意思是它应该自动发生)。然后基于最快的人,为所有其他人计算积分。(但那是后来如果我想出如何添加这些1k点,我认为生病管理) 所以我必须在UPDATE语句中添加这个逻辑。我无法做到。我只是输了。

欢迎任何建议。也许我正在思考如何做到这一点的错误方向。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

标识行的查询可能如下所示:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.ParticipantGroup = t.ParticipantGroup and
                        t2.StageNo = t.StageNo and
                        t2.time < t.time
                 );

问题是如何将其转变为更新。对于MySQL,您可以这样做:

update table StageResults sr join
             (select t.*
              from table t
              where not exists (select 1
                                from table t2
                                where t2.ParticipantGroup = t.ParticipantGroup and
                                      t2.StageNo = t.StageNo and
                                      t2.time < t.time
                                )
             ) toupdate
             on toupdate.ParticpantNumber = sr.ParticpantNumber
    set sr.points = sr.points + 1000; 

SQL Server的语法会有所不同,但您的问题标记为MySQL。

编辑:

对于SQL Server:

with toupdate as (select t.*
                  from table t
                  where not exists (select 1
                                    from table t2
                                    where t2.ParticipantGroup = t.ParticipantGroup and
                                          t2.StageNo = t.StageNo and
                                          t2.time < t.time
                                    )
                 )
update toupdate
    set points = points + 1000;