Возвращает группу столбцов с самой высокой датой

#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