我必须在生效日期之前查找报告的历史数据。有一个日期跟踪表,其中包含以下数据 -
person_number start_date end_date name position
10 01/01/2016 31/12/4712 Scott Manager
11 02/01/2006 25/06/2017 Kirk Associate
11 26/06/2017 18/03/2023 Kirk Snr. Associate
11 19/03/2023 31/12/4712 Kirk DIRECTOR
当我在查询中将生效日期作为今天的日期传递时 -
查询 1
**select person_number, name, position from abc
where nvl(:p_eff_date,trunc(sysdate)) between start_Date and end_date**
person_number start_date end_date name position
10 01/01/2016 31/12/4712 Scott Manager
11 19/03/2023 31/12/4712 Kirk DIRECTOR
我现在想显示历史输出。即直到我们传入参数的生效日期。 如果我们传递 2023 年 3 月 1 日日期,输出应该是
person_number start_date end_date name position
10 01/01/2016 31/12/4712 Scott Manager
11 02/01/2006 25/06/2017 Kirk Associate
11 26/06/2017 18/03/2023 Kirk Snr. Associate
最后一行仍然会出现,因为 3 月 1 日的数据在这个时间范围内。如何调整#query 1 来给出这个结果
你可以使用一个解析函数来做而不用查询表两次:
SELECT person_number,
name,
position
FROM (
SELECT person_number,
name,
position,
start_date,
end_date,
COUNT(
CASE
WHEN NVL(:p_eff_date,TRUNC(SYSDATE)) BETWEEN start_Date
AND end_date
THEN 1
END
) OVER (PARTITION BY person_number) AS has_match
FROM per_all_people
WHERE start_date <= NVL(:p_eff_date,TRUNC(SYSDATE))
)
WHERE has_match > 0;
其中,对于示例数据:
CREATE TABLE per_all_people (person_number, start_date, end_date, name, position) AS
SELECT 10, DATE '2016-01-01', DATE '4712-12-31', 'Alice', 'Manager' FROM DUAL UNION ALL
SELECT 11, DATE '2006-01-02', DATE '2017-06-25', 'Betty', 'Associate' FROM DUAL UNION ALL
SELECT 11, DATE '2017-05-26', DATE '2023-03-18', 'Betty', 'Snr. Associate' FROM DUAL UNION ALL
SELECT 11, DATE '2023-03-19', DATE '4712-12-31', 'Betty', 'Director' FROM DUAL;
输出:
PERSON_NUMBER | 姓名 | 位置 |
---|---|---|
10 | 爱丽丝 | 经理 |
11 | 贝蒂 | 高级。助理 |
11 | 贝蒂 | 同事 |
您可以将“截至”查询移动到子查询中,然后获取该 ID 在该子查询中的所有行。
SELECT person_number, start_date, end_date, name, position
FROM per_all_people
WHERE person_number IN (
SELECT person_number
FROM per_all_people
WHERE nvl(:p_eff_date,trunc(sysdate)) BETWEEN start_date AND end_date
)