从generate_series(int,int)更新表函数Postgres 9.0

时间:2014-10-15 18:57:44

标签: sql postgresql

我想要保留一个包含数据的表,但我必须添加一个新的整数列以便进行排序。现在这种排序将根据clientID的不同而不同,因为每个不同的客户端都需要不同的排序。所以在我的例子中有3个不同的客户端,第一个客户端有10行数据,第二个有15个,第三个有87个。所以基本上我正在寻找一个可以让我更新排序列的查询这种方式可以让我在桌面上做一个选择会得到这样的结果。

Select ordering from table Where clientID = 1 
-----------
Ordering
1
2
3
4
5
6
7
8
9
10

现在我正在使用的查询是

UPDATE data SET ordering = generate_series
FROM (SELECT * FROM generate_series(1,87)) as k <
where  clientid = '3'

这将更新所有正确的行,但只更新第一个值,所以排序中的所有值都是1.我觉得我在这里遗漏了一些东西,或者这只是在postgres中不起作用它在其他SQL语言中。这里的任何解决方案都有助于我也想知道为什么我的更新不能像我在postgres中预期的那样工作。此外,我无法根据我工作的环境更改postgres的版本。

1 个答案:

答案 0 :(得分:2)

我不明白为什么你需要generate_series()。为每个客户端编号的所有行的窗口函数应该:

update data 
   set ordering = t.rn
  from (select pk_column, 
               row_number() over (partition by clientid  order by pk_column) as rn
          from data
       ) t
where t.pk_column = data.pk_column;

pk_column是表data

的主键列