#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица с именем events. Мне нужно вернуть всю группу отдельных строк с максимальным значением для time_of_event за месяц. Например, если вы принимаете октябрь 2018 года за время события, мне нужно вернуть всю отдельную группу остальных столбцов, у которых самая высокая дата в октябре 2018 года для столбца time_of_event.
Комментарии:
1. предоставьте желаемый результат в формате таблицы
2.
SELECT user_id, date_joined, time_of_event FROM events WHERE time_of_event IN ( SELECT MAX(time_of_event ) FROM events GROUP BY YEAR(time_of_event ), MONTH(time_of_event ) ) group by user_id, date_joined, time_of_event order by time_of_event
3. Пожалуйста, не помещайте примеры кода или образцы данных в комментарии — поскольку вы не можете их отформатировать, их чрезвычайно сложно прочитать…. Вместо этого: обновите свой вопрос, отредактировав его, чтобы предоставить эту дополнительную информацию! Спасибо.
Ответ №1:
ОК. Ключевым моментом является определение соответствующего time_of_event для каждого месяца. Затем мы можем присоединить это к списку, чтобы получить все события.
Чтобы определить последнее time_of_event, вы можете использовать оператор group-by, например,
SELECT MAX(time_of_event) AS Last_time_of_event
FROM events_new
GROUP BY YEAR(time_of_event), MONTH(time_of_event)
Выше приведен список всех последних дат / времени событий. Если вы хотите отфильтровать результирующий набор, не стесняйтесь это делать (например, добавьте a WHERE time_of_event >= '20180101' AND time_of_event < '20190101'
)
Затем мы можем использовать это как подзапрос или CTE для ссылки на исходную таблицу, чтобы получить все события, например,
; WITH LTOE AS
(SELECT MAX(time_of_event) AS Last_time_of_event
FROM events_new
GROUP BY YEAR(time_of_event), MONTH(time_of_event)
)
SELECT DISTINCT en.User_ID, en.Date_Joined, en.Time_of_event, en.Event
FROM events_new en
INNER JOIN LTOE on en.Last_time_of_event = en.time_of_event
(редактировать: исправлена опечатка в GROUP BY и добавлено DISTINCT)
Ответ №2:
Вы могли бы использовать DENSE_RANK
функцию управления окнами. Что-то вроде этого
with e_cte as (
select *, dense_rank() over (partition by year(time_of_event), month(time_of_event)
order by time_of_event desc) dr
from [events])
select distinct [user_id], date_joined, time_of_event
from e_cte
where dr=1;
Ответ №3:
Я думаю, я бы просто использовал оконные функции и select distinct
:
select distinct en.*
from (select e.*, max(time_of_event) over () as max_time_of_event
from events_new en
where time_of_event >= '2018-10-01' and
time_of_event < '2018-11-01'
) en
where time_of_event = max_time_of_event