Получить самую последнюю дату только для запроса SQL-сервера, включающего несколько таблиц - PullRequest
0 голосов
/ 06 ноября 2018

Я студент и новичок в 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

И я получаю: Результат

Но посмотрите на строки 2 и 3: один и тот же человек дважды проводил одну и ту же сессию, в 2017 и 2018 годах. Я не хочу, чтобы появился 2017 год, потому что утилизация уже была проведена в 2018 году. Я хочу только результат 2018 года (строка 3), но я не могу понять, как это сделать. И это касается всех людей в БД, а не только этого человека.

1 Ответ

0 голосов
/ 06 ноября 2018

использовать оконную функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...