如何规范化/更新"订单"列

lge*_*man 3 sql postgresql

我有一个表"mydata"与一些数据数据:

id    name       position
===========================
4     foo        -3 
6     bar        -2 
1     baz        -1
3     knork      -1
5     lift       0
2     pitcher    0
Run Code Online (Sandbox Code Playgroud)

我获取使用的订购表 order by position ASC;

位置列值可能是非唯一的(由于某种原因未在此处描述:-)并且用于在期间提供自定义订单SELECT.

我想做的事 :

我想通过将唯一位置与不会破坏订单的每一行相关联来规范化表列"位置".此外,归一化后的最高位置应为-1.

希望得到的表格内容:

id    name       position
===========================
4     foo        -6 
6     bar        -5 
1     baz        -4
3     knork      -3
5     lift       -2
2     pitcher    -1
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法但未能实现正确的 update陈述.

我想这是用的

generate_series( -(select count(*) from mydata), -1) 
Run Code Online (Sandbox Code Playgroud)

获取位置列的新值是一个很好的起点,但我不知道如何将生成的列数据合并到update语句中.

希望有人可以帮助我:-)

a_h*_*ame 6

就像是:

with renumber as (
  select id,
         -1 * row_number() over (order by position desc, id) as rn
  from foo
)
update foo
  set position = r.rn
from renumber r
where foo.id = r.id
  and position <> r.rn;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle演示

  • 为了提高性能,将`和position <> r.rn`添加到where子句中.否则你最终会覆盖不应该的许多行. (2认同)