更新の回数が多くなるため、この道を踏むべきではないでしょう。競合の結果を示すクエリにrow_number()またはrank()機能を追加することができます。言われていること
、あなたは絶対に、テーブル内の情報をランキング持続列
alter table ATable add PlayerRank int
を追加し、簡単なトリガを作成することにより、ATABLE
create trigger RankingTrigger on ATable
after insert, update, delete
as
-- We don't want queries in a trigger to mess up with "Rows affected"
set nocount on
-- If any of the following columns are mentioned in a query
-- Always true for insert and delete, but we will save updates
-- if we skip processing when columns participating in ranking
-- are not changed
If update (NoOfCOrrectANswers)
OR update(NoOfPlayedQuestions)
OR update(TimeTaken)
begin
-- CTE that returns primary key and rank by competition.
-- I've changed your condition (percent of correct answers)
-- As it would rank players with one correct answer over those
-- who answered 100 questions and got only one wrong. If you
-- want to change it, replace NoOfCOrrectANswers with
-- NoOfCOrrectANswers/NoOfPlayedQuestions
; with theRank as (
select ID, row_number() over (partition by CompetitionID
order by NoOfCOrrectANswers DESC,
TimeTaken DESC) rn
from ATable
-- Only changed competitions
where CompetitionID in
-- Inserted table is available in trigger and OUTPUT clause
-- of insert, update, delete statements.
-- It contains newly added/changed rows
-- We are using it here to filter only changed competitions
-- Similary, Deleted table hold a copy of removed rows for delete
-- and old values for update
(
select CompetitionID
from Inserted
union
select CompetitionID
from Deleted
)
)
update ATable
-- Update to rank from theRank CTE
set PlayerRank = theRank.rn
from ATable
-- All records participation in affected competitions
inner join theRank
on ATable.ID = theRank.ID
-- Only change if really changed
-- This part is very likely not needed. I have never tested
-- to see if it affects performance
and isnull(ATable.PlayerRank, 0) <> theRank.rn
end
開始のトリガを作成しなければならないと感じた場合彼らがどのように働いているかを理解し、より複雑なものに組み込みます。あなたが予想通りに動作しないトリガーを持っている場合、ここにコードを掲示すれば人々が助けることができます – Brian
ちょっと考えました。なぜ、プレイヤー1が2秒で質問1に答えたかのような生データを追跡するだけではないからです。次に、平均などを処理するテーブルの上にビューを作成します。ビュー内でSQL 2008ランク関数を使用することもできます。トリガーは、テーブルが頻繁に叩かれたり激しく叩かれたりするときに、パフォーマンスを低下させる可能性があります。ビューを使用すると、必要なときにのみ必要な値を計算することができます。 – Namphibian
ソーステーブルの定義、つまりプレイヤーがどのように回答したか、ターゲットテーブル定義のデータを含むテーブルを追加できれば、もう少しお手伝いできるでしょう。テーブルの定義がなければ、私は役に立たないだろう。 – Namphibian