ID EMP_NAME DEPT_NAME EFFORTS ACTIVITY_DAY
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 30 13-May-15
633 ALEX XYZ 0 15-May-15
但我需要将这些努力填充为30天,例如因为ALEX在那里有两个dept_name,所以这里有30个已经填充了两次,因为15月5日到15日。 我需要像这样修改记录:
ID EMP_NAME DEPT_NAME EFFORTS ACTIVITY_DAY
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 0 13-May-15
633 ALEX XYZ 0 15-May-15
答案 0 :(得分:0)
根据您所需的输出,如果我理解正确,您希望在给定EFFORTS
的{{1}}存在多行时将EMP_NAME
列更新为零。
您可以 ROW_NUMBER()分析函数对具有给定条件的行进行排名,然后更新排名为>的行的工作量1。
让我们看看:
<强>设置强>
ACTIVITY_DAY
驾驶查询
SQL> SELECT * FROM t;
ID EMP_ DEP EFFORTS ACTIVITY_
-------- ---- --- ---------- ---------
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 30 13-May-15
633 ALEX XYZ 0 15-May-15
SQL>
更新表格的MERGE语句
SQL> SELECT t.*,
2 row_number()
3 OVER(PARTITION BY emp_name, activity_day ORDER BY activity_day) rn
4 FROM t;
ID EMP_ DEP EFFORTS ACTIVITY_ RN
-------- ---- --- ---------- --------- ----------
633 ALEX XYZ 30 13-May-15 1
633 ALEX ABC 30 13-May-15 2
633 ALEX XYZ 30 14-May-15 1
633 ALEX XYZ 0 15-May-15 1
SQL>
让我们检查
SQL> MERGE INTO t
2 USING(
3 SELECT t.*,
4 row_number()
5 OVER(PARTITION BY emp_name, activity_day ORDER BY activity_day) rn
6 FROM t
7 ) u
8 ON (t.ID = u.ID
9 AND t.emp_name = u.emp_name
10 AND t.dept_name = u.dept_name
11 AND t.activity_day = u.activity_day)
12 WHEN MATCHED THEN UPDATE SET efforts = 0
13 WHERE u.rn > 1;
1 row merged.
SQL>
所以,这给出了所需的输出。