#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