我有一个表"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语句中.
希望有人可以帮助我:-)
就像是:
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)