我需要根据特定条件增加列值。
我有两张桌子 -
表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;
答案 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);
分享并享受。
答案 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
....
在您的情况下,您按名称进行分区。