2016-05-11 1 views
0

私はこの更新列

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 
+0

何か試しましたか?あなたの投稿の名前を取って、その前にSQLを置いてGoogleに入れておくのと同じですか? – dfundako

+0

はい、何も役に立ちません。 –

答えて

3

を他の行の値に依存する列。そうしないと、行が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 

しかし:

クエリは、次のようになります「位置」を計算しますテーブルが更新されるたびにの更新プログラムを実行する必要があることを念頭に置いてください。それで、適切なサイズのテーブルが更新されると、パフォーマンスに問題が生じる可能性があります。ロット。

+0

申し訳ありませんが、私はインクリメンタルIDを取得しないようにカラムを更新する必要があります –

+1

その後、更新クエリで同じ考え方を使用してください。ちなみに、この答えはインクリメンタルIDとは関係ありませんので、実際に理解していますか? –

+0

私の問題は更新クエリを書くことです –

0

あなたはこのような何かを行うことができます。

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 
1

もDENSE_RANKを使用することを検討してください()の代わりにRANKの()あなたは「ポイント」変化として1であなたの「位置」のランキングをインクリメントしたい場合。 RANK()はあなたが望むことをしますが、 'points' standing(あなたのスペックにはこれが当てはまる場合)の中でいくつの重複 'userid'が等しいかに応じてnumber sequence gapを作成します。

これらの違いについては、answerを参照してください。