增加 Oracle 中的列值
Increment a column value in Oracle
我需要根据特定条件增加列值。
我有 2 tables -
Table 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
Table B 有名称(外键)、日期(与 Table 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
我需要增加 table 中显示的计数器。所以对于每个名字,计数器应该重置并从 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;
请copy/paste查看结果:
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
....
在您的情况下,您按名称进行分区。
以下查询应该可以满足您的要求:
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);
分享和享受。
我需要根据特定条件增加列值。
我有 2 tables -
Table 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
Table B 有名称(外键)、日期(与 Table 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
我需要增加 table 中显示的计数器。所以对于每个名字,计数器应该重置并从 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;
请copy/paste查看结果:
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
....
在您的情况下,您按名称进行分区。
以下查询应该可以满足您的要求:
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);
分享和享受。