在Oracle中增加列值

时间:2015-02-17 20:09:18

标签: oracle counter

我需要根据特定条件增加列值。

我有两张桌子 -

表A具有ID,名称,日期等

Id  Name    Date
1   ABC 3/1/2014
2   ABC 4/1/2014
3   ABC 5/1/2014
4   DEF 4/1/2014
5   DEF 5/1/2014
6   HIJ 1/1/2014
7   HIJ 2/1/2014
8   HIJ 3/1/2014
9   HIJ 4/1/2014
10  HIJ 5/1/2014

表B具有名称(外键),日期(将与表A相同),计数器等。

Name    Date    Counter(the value that I need is in this column, it will be zero by default)
ABC 3/1/2014    0
ABC 4/1/2014    1
ABC 5/1/2014    2
DEF 4/1/2014    0
DEF 5/1/2014    1
HIJ 1/1/2014    0
HIJ 2/1/2014    1
HIJ 3/1/2014    2
HIJ 4/1/2014    3
HIJ 5/1/2014    4

我需要增加计数器,如上表所示。因此,对于每个名称,计数器应该重置并从0开始,每个名称的日期将不同,所以我需要考虑到这一点(这意味着我不能假设所有名称都是1/31/2014为0。会以5/1/2014结束。所以我需要更新柜台,直到日期已达到5/1/2014。

实现这一目标的最佳方法是什么?我正在尝试编写一个过程,但不确定如何更新游标中不同名称的计数器。我对任何建议持开放态度。感谢。

编辑:::更新代码

Update Table B, set counter = 0;

declare

cursor rec is

select a.name, a.postingdate, b.counter
from table A a
inner join table B b
on a.name = b.name
order by a.name, a.date;

begin

    open rec;
    LOOP
        fetch rec into v_name, v_date, v_counter;
        exit...........

**<How can I reset my counter here for different names>**
        if date < to_date ('01-may-2014', 'dd-mon-yy') then v_counter := v_counter +1;  
        end if;

        update table b set counter = v_counter where current of rec;
    END LOOP;
    commit;
END;

2 个答案:

答案 0 :(得分:3)

以下查询应该执行您想要的操作:

SELECT NAME, TO_CHAR(SOME_DATE, 'MM/DD/YYYY'), ROWCOUNT-1 AS COUNTER
  FROM (SELECT NAME,
               SOME_DATE,
               ROW_NUMBER() OVER (PARTITION BY NAME
                                  ORDER BY ID, NAME, SOME_DATE) ROWCOUNT
          FROM TABLE_A);

SQLFiddle here

分享并享受。

答案 1 :(得分:2)

请复制/粘贴以查看结果:

SELECT deptno, ename (your_counter-1) new_counter FROM 
 ( SELECT deptno, ename
       , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY deptno, ename) your_counter
FROM scott.emp
);

10  CLARK   0
10  KING    1
10  MILLER  2
20  ADAMS   0
20  FORD    1
20  JONES   2
20  SCOTT   3
....

在您的情况下,您按名称进行分区。