我有一个表asg_tab和grad_tab,例如:
asg_tab
person_id grade_id full_name start date end date
1 smith 01-Jan-2016 20-Feb-2016
1 001 smith 21-Feb-2016 31-Dec-4712
2 will 01-Feb-2016 18-Mar-2016
2 004 will 19-Mar-2016 31-Dec-4712
grd_tab
grade_id grade name
001 Band 1
002 Band 2
004 Band 3
现在在asg标签中,如果grade_id有任何变化,我必须创建一个将返回start_date和grade_name的查询/函数
我为此创建了以下查询:
SELECT *
From (
Select Person_id,
Grade_Id,
LAG(grade_id) OVER (PARTITION BY person_ID ORDER BY start_Date) AS prev_grade_line1,
Row_Number() Over (Partition By Person_Id Order By Start_Date Desc) As Rn,
Effective_Start_Date
From asg_tab
)
WHERE rn = 1;
但是,当所有开始日期的人员ID为空时,这也会返回等级
答案 0 :(得分:0)
也许这可以让您了解如何为您的问题制作功能。
CREATE OR REPLACE FUNCTION WaterIsNotBlue (nId IN VARCHAR2, nColumnA IN VARCHAR2)
RETURN VARCHAR2
AS
CURSOR cTableA IS
SELECT * FROM TableA WHERE Id = nId;
rTableA cTableA%ROWTYPE;
BEGIN
-- Fetch current values of row.
OPEN cTableA;
FETCH cTableA INTO rTableA;
CLOSE cTableA;
INSERT INTO TableA(Id, ColumnA)
VALUES(nId, nColumnA);
COMMIT;
-- Check if anything changed.
IF rTableA.ColumnA != nColumnA THEN
RETURN 'A';
ELSE
RETURN 'B';
END IF;
END;
/
答案 1 :(得分:0)
您似乎需要一个触发器来检测更改..但是通过触发器,您只能将所需信息(effective_Start日期和名称)插入到新表中。