在一个表中使用select MIN从特定组更新SQL

在一个表中使用select MIN从特定组更新SQL,sql,sql-server,visual-studio-2012,localdb,Sql,Sql Server,Visual Studio 2012,Localdb,我对SQL真的很陌生。我搜索了一个符合我要求的答案,我会理解已经做了什么——我没有通过obv。因此,这里是: 我正在做一个程序,可以保存马拉松比赛的数据。因此,我有一个表StageResults,其中有列:StageNo ParticipantNumber ParticipantGroup Timeas,在距离时间内,以整秒为单位,因此int和Points 例如: - 1|01|M21|500|X - 1|22|M21|550|X - 1|45|M21|530|X - 1|47|F09|

我对SQL真的很陌生。我搜索了一个符合我要求的答案,我会理解已经做了什么——我没有通过obv。因此,这里是: 我正在做一个程序,可以保存马拉松比赛的数据。因此,我有一个表StageResults,其中有列:StageNo ParticipantNumber ParticipantGroup Timeas,在距离时间内,以整秒为单位,因此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语句下使用了这个。没有语法错误,但错误,我试图插入一个重复的主键。我认为这可以通过添加groupby语句来解决。所以我还没有真正测试过这个

我最终希望在每个运行阶段和每个组中为最快的参与者设置1000分,我的意思是这应该是自动发生的。然后根据速度最快的人计算其他所有人的分数。但那是以后的事了,如果我知道如何增加这1k分,我想我会应付的 所以我必须在UPDATE语句中添加这个逻辑。我不能。我只是迷路了

欢迎任何建议。也许我在怎么做的问题上完全想错了方向。
任何帮助都将不胜感激。

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

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;

非常感谢您快速、准确的回答。我想我正在使用SQL server。语法有什么不同?行标识的语法也不同吗?@indrox。如果您使用的是SQL Server,那么您应该适当地标记您的问题。是否有一个表(如参与者)包含您想要更新的分数?是的,我对标记感到抱歉。编辑。我要更新的表是StageResultsThanks!干杯编辑:打字错误