用其他列更新列

时间:2014-02-19 15:27:34

标签: sql oracle

我使用PL/SQL,这是我的表

 a   |    b    |    c   |   d
-----------------------------
 1   |    1    |    2   |
 1   |    2    |    2   |
 1   |    2    |    2   |
 1   |    3    |    2   |
 1   |    3    |    2   | 
 2   |    2    |    2   |
 2   |    4    |    2   |
 2   |    5    |    1   |

它将成为

 a   |    b    |    c   |   d
-----------------------------
 1   |    1    |    2   |  1
 1   |    2    |    2   |  2
 1   |    2    |    2   |  2
 1   |    3    |    2   |  3
 1   |    3    |    2   |  3
 2   |    2    |    2   |  1
 2   |    4    |    2   |  2
 2   |    5    |    1   |  

d列将从1开始,然后加1

如果b列开始更改,

如果a列不同,d列将从1重复开始。

我想更新dc等于2

我知道如何使用ROW_NUMBER() OVER (PARTITION BY ),但我有两个列关系。我不知道。

怎么做?谢谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,Oracle更新中的数据操作很痛苦。

这样做你想要的:

update table t
    set d = (select count(distinct b)
             from table t2
             where t2.a = t.a and
                   t2.b <= t.b
            ) ;

select查询中,您可以使用dense_rank()

执行此操作

答案 1 :(得分:0)

你不能在SET子句中使用窗口函数,我相信你需要使用嵌套查询来获取d的新值。以下内容适用于您:

UPDATE T
SET    T.d = D.d
FROM Table1 T
-- Join on a subquery to get the new 'd' values:
INNER JOIN (
  SELECT a, b, c, -- Get the identifiers for this row
         -- Get the new value for d
        dense_rank() over (partition by a 
                           order by b) as d
  FROM Table1
) D -- Map the new 'd' values back to the appropriate row
ON T.a = D.a and T.b = D.b AND T.c = D.c

SQLFiddle