SQL查询以查找表中截至日期的历史数据

问题描述 投票:0回答:2

我必须在生效日期之前查找报告的历史数据。有一个日期跟踪表,其中包含以下数据 -

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 来给出这个结果

sql oracle bi-publisher
2个回答
3
投票

你可以使用一个解析函数来做而不用查询表两次:

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 贝蒂 同事

小提琴


0
投票

您可以将“截至”查询移动到子查询中,然后获取该 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
)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.