Получить максимальный месяц из запроса, который возвращает несколько лет

#sql #sql-server #tsql #datetime #greatest-n-per-group

#sql #sql-сервер #tsql #дата и время #наибольшее число пользователей на группу

Вопрос:

У меня есть таблица с датами, одна дата в месяц (несколько месяцев будут отсутствовать, но это ожидается), но возвращается несколько лет. Мне нужно получить только последний месяц. Итак, если у меня есть данные, скажем, за месяцы 8, 7, 6 и т. Д. В 2020 Году, Тогда верните их StartDate. И для месяцев 10, 11 и 12 он должен возвращать начальную дату с 2019 года или где бы он ни нашел ее последней. идентификатор и длина курса являются частью таблицы, но не имеют значения для этой задачи. StartDate имеет тип date .

Это верхние 15 строк таблицы

 id  StartDate   courseLength
153 2020-08-31  63
153 2020-07-31  35
153 2020-06-30  60
153 2020-05-31  17
153 2020-03-31  51
153 2020-01-31  59
153 2019-12-31  30
153 2019-10-31  51
153 2019-08-31  59
153 2019-06-30  54
153 2019-05-31  17
153 2019-03-31  56
153 2019-01-31  55
153 2018-12-31  27
153 2018-10-31  54
  

И это то, чего я ожидаю

 id  StartDate   courseLength
153 2020-08-31  63
153 2020-07-31  35
153 2020-06-30  60
153 2020-05-31  17
153 2020-03-31  51
153 2020-01-31  59
153 2019-12-31  30
153 2019-10-31  51
153 2018-11-30  65
153 2018-09-31  53
153 2019-05-31  17
153 2018-04-30  13
  

Комментарии:

1. id Имеет ли какое-либо отношение к вопросу? Есть ли courseLength ? Какой тип данных StartDate ? Пожалуйста, прочтите это для получения нескольких советов по улучшению вашего вопроса.

Ответ №1:

Вы можете использовать оконные функции:

 select *
from (
    select t.*,
        row_number() over(partition by id, month(startdate) order by startdate desc) rn
    from mytable t
) t
where rn = 1
  

Ответ №2:

попробуйте с этим

 SELECT
    R.id, R.StartDate, R.courseLength
FROM (
    SELECT
        id, StartDate, courseLength, RANK() OVER(PARTITION BY MONTH(StartDate) ORDER BY StartDate DESC) as rank
    FROM
        #t
    ) R
WHERE
    R.rank = 1
  

Ответ №3:

или вы можете использовать это :

 select * from table
 join in (
        select 
          max(date) maxdate
          , id 
        from table
        group by 
          month(date) , id 
    ) max
  on max.id = table.id
  and max.maxdate = table.date