仅在涉及多个表的SQL Server查询上获取最新日期

时间:2018-11-06 09:20:57

标签: sql-server date

我是一名学生,还是SQL新手。我正在使用一个与人员组成有关的数据库。必须在特定的日期限制之前再次进行某些编排(某些是每24个月最高一次,或者每36个月最高一次),但是如果需要,可以再次进行。我需要一个查询,该查询显示每个必须“回收”的人(意味着他们必须在xxx天之内再次跟踪组织)。我设法做到了,但是我的查询始终显示它们已经完成的所有形式,但是我只需要最新的形式就可以正确计算何时需要“回收”它们:

这是我的查询:

select ATR_NOM as 'Last name',
       ATR_PRENOM as 'First name',
       TME_LIBELLE as 'Session',
       TME_ID as 'Session ID',
       SSN_DATE_DEBUT as 'Begenning formation date',
       TME_RECYCLAGE_DELAI as 'Recycling limit in month',
       DATEADD(mm, TME_RECYCLAGE_DELAI, SSN_DATE_DEBUT) as 'Date limit for recycling'


from INSCRIPTION
join SESSION on SSN_ID = INS_SSN_ID
join ACTEUR on INS_ATR_ID = ATR_ID
join THEME on SSN_TME_ID = TME_ID

--Only formation that requires recycling
where TME_RECYCLAGE_ACTIF =1

--Only after the current day
and DATEADD(mm, TME_RECYCLAGE_DELAI, SSN_DATE_DEBUT) > SYSDATETIME()

order by ATR_NOM

我得到: Result

但请看第2行和第3行:同一个人在2017年和2018年两次进行了相同的会话。我不希望2017年出现,因为回收已经在2018年完成。我只希望2018年的结果(第3行)出现,但我不知道该怎么做。这适用于数据库中的所有人员,而不仅仅是该人员。

1 个答案:

答案 0 :(得分:1)

使用窗口函数row_number()(大多数dbms支持窗口函数)

    with cte 
    (
    select ATR_NOM as 'Last name',
           ATR_PRENOM as 'First name',
           TME_LIBELLE as 'Session',
           TME_ID as 'Session ID',
           SSN_DATE_DEBUT as 'Begenning formation date',
           TME_RECYCLAGE_DELAI as 'Recycling limit in month',
           DATEADD(mm, TME_RECYCLAGE_DELAI, SSN_DATE_DEBUT) as 'Date limit for recycling',
 row_number() over(parition by ATR_NOM,ATR_PRENOM,TME_LIBELLE,TME_ID
                  order by SSN_DATE_DEBUT desc)rn


    from INSCRIPTION
    join SESSION on SSN_ID = INS_SSN_ID
    join ACTEUR on INS_ATR_ID = ATR_ID
    join THEME on SSN_TME_ID = TME_ID

    --Only formation that requires recycling
    where TME_RECYCLAGE_ACTIF =1

    --Only after the current day
    and DATEADD(mm, TME_RECYCLAGE_DELAI, SSN_DATE_DEBUT) > SYSDATETIME()


    ) select * from cte where rn=1