我有一个查询,我认为这个问题直到很久以前才按预期进行。
以下查询通过我的“玩家”表格,并为每位在该学校重量级技能最高的玩家更新'启动'值为true。
例如,如果有权重为X的500名玩家,它将选择属于同一所学校的所有玩家,并且对于具有最高技能的玩家,它会将'starter'值更新为true
UPDATE player
SET starter = 'TRUE'
WHERE NOT EXISTS
(
SELECT school, weight, skill
FROM player b "
WHERE b.school = player.school
AND b.weight = player.weight
AND b.skill > player.skill
)
AND player.game_id = 1
我现在遇到的问题是,如果同一个学校有两名同一体重的球员,也具有相同的技能,那么他们的'首发'值都设为真。
所以我的问题是,我需要在此查询中添加哪些内容,以便只为特定学校提供一个权重的启动器?
我还有一个名为'age'的专栏,如果可以的话,我想选择相同技能发生的两个较低的年龄。
答案 0 :(得分:3)
您必须更改您的查询,以便只更新这些行,这些行没有其他行,school
/ weight
更高skill
或 lower age
。
如果您的行具有相同的id
和相同的skill
,我还会添加一个唯一的列age
。
替换
AND b.skill > player.skill
通过
AND ( ( b.skill > player.skill )
OR ( b.skill = player.skill AND b.age < player.age )
OR ( b.skill = player.skill AND b.age = player.age AND b.id > player.id )
)
答案 1 :(得分:0)
我不知道如何为此计算技能已写入替换选择您可以加入它并相应地更新行。还创建了一些包含9行的样本数据;最后两个H和我有相同的技能和学校,但不同的年龄(一天。)假设你有出生日期,最大/分钟将起作用。你仍然可以拥有相同年龄的球员,所以需要有一个机制来处理这个问题。不确定标准所以它不适合在这里。
declare @players table (school varchar(100), weight float, skill int, dob datetime, name varchar(100))
insert into @players
select 'a', 100, 10, GETDATE(), 'a'
union all select 'a', 101, 11, GETDATE(), 'b'
union all select 'a', 102, 12, GETDATE(), 'c'
union all select 'a', 103, 13, GETDATE(), 'd'
union all select 'a', 104, 14, GETDATE(), 'e'
union all select 'a', 105, 15, GETDATE(), 'f'
union all select 'a', 106, 16, GETDATE(), 'g'
union all select 'a', 107, 17, GETDATE(), 'h'
union all select 'a', 107, 17, dateadd(dd,-1,GETDATE()), 'i'
select * from @players
SELECT
school,
weight,
max(skill) as Skill,
MIN(dot) as DOB
FROM @players b
group by school, weight
返回; 8行并选择107个重量级别球员中较年轻的球员。
school weight (No column name) (No column name)
a 100 10 2012-04-23 08:53:19.877
a 101 11 2012-04-23 08:53:19.877
a 102 12 2012-04-23 08:53:19.877
a 103 13 2012-04-23 08:53:19.877
a 104 14 2012-04-23 08:53:19.877
a 105 15 2012-04-23 08:53:19.877
a 106 16 2012-04-23 08:53:19.877
a 107 17 2012-04-22 08:53:19.877