1

少し前までは意図したとおりに機能していたと思っていたクエリがあります。

次のクエリは、私の「プレーヤー」テーブルを通過し、その学校で自分の体重で最高のスキルを持つすべてのプレーヤーの「スターター」値を true に更新します。

たとえば、体重 X のプレーヤーが 500 人いる場合、同じ学校に属するすべてのプレーヤーが選択され、そのうち最高のスキルを持つプレーヤーの「スターター」値が 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

私が今遭遇した問題は、同じ学校から同じ体重で同じスキルを持つ 2 人のプレーヤーがいる場合、両方の「スターター」値が true に設定されていることです。

だから私の質問は、特定の学校の体重で 1 人のスターターのみを許可するには、このクエリに何を追加する必要があるかということです。

「年齢」という名前の列もありますが、可能であれば、同じスキルが発生する 2 つの低い年齢を選択したいと考えています。

4

2 に答える 2

3

クエリを変更する必要があります。これにより、このschool/に対して他の行がなくweight、より大きいskill または小さい行のみが更新されageます。

同じ行と同じid行がある場合に備えて、一意の列を追加しています。skillage

交換

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 )
    )
于 2012-04-23T07:48:32.110 に答える
0

これについてスキルがどのように計算されるかはわかりませんが、それに参加してそれに応じて行を更新できる代替選択を作成しました。9行のサンプルデータもいくつか作成しました。最後の 2 つの H と私は同じスキルと学校を持っていますが、年齢が (1 日ずつ) 異なります。同じ年齢のプレーヤーがまだいる可能性があるため、それに対処するメカニズムが必要になります。基準がわからないため、ここでは対応していません。

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
于 2012-04-23T07:57:19.430 に答える