我是一名学生,还是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行)出现,但我不知道该怎么做。这适用于数据库中的所有人员,而不仅仅是该人员。
答案 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