私はmedias
というテーブルを持っています。ここでは、最近Int
というsort_order
という新しい列を追加しました。ランクウィンドウ関数を使用したPostgres UPDATE
行の値は、テーブル全体ではなく、それぞれのowner_user_id
フィールドに固有の値になります。それにもかかわらず、私はそれらの一意性を気にしない。
これは、ユーザーがアップロードした写真のソート順を設定できるようにすることです(最大10個までドラッグアンドリオーダーなどが可能です)。ユーザーが写真を「削除」したときにレコードを削除しない場合、その行のvisible
フィールドをfalse
に設定するだけです。
私は、sort_order
を追加する移行を導入しています(彼らは写真を注文することができず、ちょうどorder by created_at asc
に従ってソートされていました)。
新しいフィールドを追加したので、新しいsort_order
のデフォルト値は10
になりました(アプリケーションを更新していない人に下位互換性があります)。これは、次のようなもの吐き出す
select
owner_user_id,
sort_order, rank() over (PARTITION BY owner_user_id ORDER BY sort_order asc, created_at asc) as new_sort_order
from medias
where visible=true
order by sort_order asc, created_at asc;
:この時点で
owner_user_id | sort_order | new_sort_order
---------------+------------+---------------
76 | 10 | 1
76 | 10 | 2
76 | 10 | 3
76 | 10 | 4
76 | 10 | 5
9 | 10 | 1
9 | 10 | 2
9 | 10 | 3
9 | 10 | 4
9 | 10 | 5
79 | 10 | 1
79 | 10 | 2
87 | 10 | 1
87 | 10 | 2
87 | 10 | 3
85 | 10 | 1
90 | 10 | 1
90 | 10 | 2
90 | 10 | 3
を私は本当にやりたいことがあることに設定されて
私はこのクエリを思い付くことができましたsort_order
〜その
rank()
。どのようにこれを行うにはどのような考え?