私はこの更新列
userid | points | position
1 | 100 | NULL
2 | 89 | NULL
3 | 107 | NULL
のようなテーブルを持っている私は、更新のためのポイントDESCによる位置の列の順序、例の結果クエリを必要とする:私は物理を使用していないだろう
userid | points | position
1 | 100 | 2
2 | 89 | 3
3 | 107 | 1
私はこの更新列
userid | points | position
1 | 100 | NULL
2 | 89 | NULL
3 | 107 | NULL
のようなテーブルを持っている私は、更新のためのポイントDESCによる位置の列の順序、例の結果クエリを必要とする:私は物理を使用していないだろう
userid | points | position
1 | 100 | 2
2 | 89 | 3
3 | 107 | 1
を他の行の値に依存する列。そうしないと、行が1つ変更されるたびに表全体を更新する必要があります。ビューまたは他のメカニズムを使用して、その場で位置を計算します。あなたはそれがUPDATE
あなたが
UPDATE a
SET a.position = b.position
FROM {table_name} a
INNER JOIN
(
SELECT
userid,
RANK() OVER (ORDER BY points DESC) AS position
FROM {table_name}
) b
ON a.userid = b.userid
のようなものを使用しますが、保つことができるようにするを持っている場合、
SELECT
userid,
points,
RANK() OVER (ORDER BY points DESC) AS position
しかし:
クエリは、次のようになります「位置」を計算しますテーブルが更新されるたびにの更新プログラムを実行する必要があることを念頭に置いてください。それで、適切なサイズのテーブルが更新されると、パフォーマンスに問題が生じる可能性があります。ロット。
申し訳ありませんが、私はインクリメンタルIDを取得しないようにカラムを更新する必要があります –
その後、更新クエリで同じ考え方を使用してください。ちなみに、この答えはインクリメンタルIDとは関係ありませんので、実際に理解していますか? –
私の問題は更新クエリを書くことです –
あなたはこのような何かを行うことができます。
UPDATE t
SET position = t2.position
FROM table t
JOIN (
SELECT
userid,
points,
RANK() OVER (ORDER BY points DESC) AS position
FROM table) t2 ON t2.userid = t.userid
もDENSE_RANKを使用することを検討してください()の代わりにRANKの()あなたは「ポイント」変化として1であなたの「位置」のランキングをインクリメントしたい場合。 RANK()はあなたが望むことをしますが、 'points' standing(あなたのスペックにはこれが当てはまる場合)の中でいくつの重複 'userid'が等しいかに応じてnumber sequence gapを作成します。
これらの違いについては、answerを参照してください。
何か試しましたか?あなたの投稿の名前を取って、その前にSQLを置いてGoogleに入れておくのと同じですか? – dfundako
はい、何も役に立ちません。 –