【问题标题】:Resequencing a column with identifier in Postgresql在 Postgresql 中对带有标识符的列重新排序
【发布时间】:2011-05-17 20:57:51
【问题描述】:

以下代码工作并创建一个带有序列号的临时表,该序列号为每个新名称重新启动:

with results as (select row_number() over (partition by name order BY name) as mytid,name from telephn_table)
select * from results order by name

然而,我的目标是将新的序列号永久插入到电话表中。 如何将新的序列号从结果表传输到电话表? MySql 遇到以下问题,但无法将其转换为 Postgresql。

MySQL: Add sequence column based on another field

谁能帮忙?

【问题讨论】:

    标签: postgresql sequencing


    【解决方案1】:

    如果有记忆,row_number() 会返回它自己的分区内的数字。换句话说,row_number() over (partition by name order BY name) 将为除重复项之外的每一行返回 1。你可能想要rank() over (order by name)


    经过长时间的讨论:

    update telephn_table
    set sid = rows.new_sid
    from (select pkey,
                 row_number() over (partition BY name) as new_sid,
                 name
          from telephn_table
          ) as rows
    where rows.pkey = telephn_table.pkey;
    

    【讨论】:

    • @Denis 谢谢你的回答,但不幸的是它没有解决我的问题,即“如何将新的序列号从结果表传输到电话表?”。正如我在我的 OP 中所述,我列出的代码令我满意,我只是不知道如何复制/传输序列号。从结果表进入电话表。
    • 哦,对不起。我以为你知道如何做那部分......只需更新表格:update yourtable set tid = rows.tid from (select ...) as rows where rows.id = yourtable.id;
    • @Denis 再次感谢。如果我理解正确(请记住我是 postgresql 初学者),这就是我想出的:
    • update telephn_table set sid = rows.mytid from (with results as (select rank() over (partition by name order BY name) as mytid,name from telephn_table) select * from results order by name)作为行 where rows.name = telephn_table.name;
    • 这会导致 sid 列在所有行中都为 1。请注意,从 row_number() 更改为 rank() 给出了相同的结果。我做错了什么?
    【解决方案2】:

    这行得通! (请参阅我的 OP 链接到以前的 MySql 链接。在 Postgresql 中它无需临时表即可工作)

    alter table telephn_table add column tid integer default 0; UPDATE telephn_table set tid=(SELECT count(*)+1 from telephn_table t where t.sid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2016-12-27
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多