SQL查询返回列更改时的最新日期

Posted

技术标签:

【中文标题】SQL查询返回列更改时的最新日期【英文标题】:SQL query to return the latest date when the column has changed 【发布时间】:2020-02-20 00:32:22 【问题描述】:

我有一个表per_all_assignments_m paam,它有 position_id 和其他对象 ID。该表有effetive_start_Date 和effective_end_date。 每当此表有更新时,effective_start_Date 就会更改为进行更改的日期。

assignment_number    person_id             eff_start_Date         eff_end_date         POSISTION_ID    GRADE_ID        
E12                   12                     12-JAN-2020           31-DEC-4712           10                 2         
E12                   12                     25-NOV-2019           11-JAN-2020           10                 2         
E12                   12                     02-APR-2019           24-NOV-2019           8                  2
---
E11                   11                    12-JAN-2020           31-DEC-4712           10                 2         
E11                   11                     25-NOV-2019           11-JAN-2020           10                 2         
E11                   11                     02-APR-2019           24-NOV-2019           10                  2              

以下查询不会为 PREv_Job_TItle 返回任何内容,因为最近 2 行中的 position_id 没有变化。

我想在下面的查询中获取另一列 - cur_eff_dt。如果 PAAM 表中截至 trunc(sysdate) 的最新行没有变化, 那么 cur_eff_dt 应该返回 position_id 更改的最后日期或该职位被标记给员工的第一个日期。 从上表中 - 对于员工 E12,cur_eff_dt 应该是 2019 年 11 月 25 日。 FOR Employee number - E11 它应该是 02-APR-2019。

有什么功能可以实现吗?

    select distinct 
PAPF.PERSON_NUMBER, 
    NULLIF((select distinct name
from   (
  select distinct m.person_id,m.position_id,h.name,
         lead(m.position_id,1,0) over (order by m.position_id) as nextr ,
         lag(m.position_id,1,0) over (order by m.position_id) as prevr        
  from   per_all_assignments_M m,HR_ALL_POSITIONS_F F,hr_all_positions_f_vL h
  where m.position_id=f.position_id
             and f.position_id=h.position_id
 and sysdate between h.effective_start_date and h.effective_end_date
and m.person_id=papf.person_id
and h.effective_end_date=TO_DATE('12/31/4712 00:00:00', 'MM/DD/YYYY HH24:MI:SS'))
where nextr<>prevr and rownum=1),POS.NAME)PREv_Job_TItle,
     POS.NAME Current_job_title


from    per_all_people_f PAPF
        ,PER_PERSON_NAMES_F PPNF
        ,PER_PERIODS_OF_SERVICE PPOS
        ,PER_ALL_ASSIGNMENTS_M PAAM
        ,PER_PERSON_TYPES PPT
        ,PER_GRADES_F_TL PGF
        ,hr_all_positions_f_vL POS
        ,PER_JOBS_F PJF


where   1=1
and papf.person_number = '111'

        AND PPOS.PERSON_ID =PAPF.PERSON_ID
        AND PPOS.PERSON_ID=PPNF.PERSON_ID
        AND PPNF.NAME_TYPE = 'GLOBAL'
        AND PAAM.PERSON_ID=PAPF.PERSON_ID
        AND PPOS.PERSON_ID=PAAM.PERSON_ID
        AND PPOS.LEGISLATION_CODE=PAAM.LEGISLATION_CODE
        AND PAAM.PRIMARY_ASSIGNMENT_FLAG = 'Y'
        AND PAAM.ASSIGNMENT_TYPE = 'E' 
        AND PAAM.EFFECTIVE_LATEST_CHANGE = 'Y'
        AND PAAM.ASSIGNMENT_STATUS_TYPE = 'ACTIVE'
        AND PAAM.PRIMARY_FLAG='Y'
        AND PAAM.PERIOD_OF_SERVICE_ID = PPOS.PERIOD_OF_SERVICE_ID
        AND PGF.GRADE_ID(+)=  PAAM.GRADE_ID
        AND PGF.LANGUAGE='US'
        AND POS.POSITION_ID(+)=PAAM.POSITION_ID
        AND PJF.JOB_ID(+)=PAAM.JOB_ID
                        AND PAAM.EFFECTIVE_END_DATE=TO_DATE('12/31/4712 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
        AND TRUNC(SYSDATE) BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE

        AND TRUNC(SYSDATE) BETWEEN PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
        AND TRUNC(SYSDATE) BETWEEN PGF.EFFECTIVE_START_DATE AND PGF.EFFECTIVE_END_DATE
        AND TRUNC(SYSDATE) BETWEEN POS.EFFECTIVE_START_DATE AND POS.EFFECTIVE_END_DATE

【问题讨论】:

【参考方案1】:

我不确定您当前的查询,但您可以使用以下查询来实现所需的内容:

Select person_id, assignment_number,
       Max(effective_start_date) keep (dense_rank last order by rn) as cut_off_date
From
(Select t.*, 
        case when lead(position_id) 
          over (partition by person_id, assignment_number order by effective_start_date)
        <> position_id then 1 else 0 end as rn
From per_all_assigments_m t
Where person_id in (11,12))
Group by person_id, assignment_number

干杯!!

【讨论】:

这是给出前一个职位 id 的最晚有效开始日期,而不是最新职位 id 的最不有效开始日期。如果我们采用上面的示例 - 它为 E12 提供 02-APR-2019,它应该是 25-NOV-2019

以上是关于SQL查询返回列更改时的最新日期的主要内容,如果未能解决你的问题,请参考以下文章

Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目

在 SQL 查询中选择最新或最近的日期

SQL查询获取特定日期和列中最新日期之间的数据

如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]

SQL查询根据日期返回结果

sql怎么添加自定义列并且将此列的数据作为条件查询