#sql-server #tsql
#sql-сервер #tsql
Вопрос:
Я пытаюсь получить последнее значение в группе значений (раздел), но у меня возникли небольшие проблемы. В приведенном ниже примере вы можете увидеть пример набора данных, с которым я работаю. MAX() не будет работать, поскольку «последним» здесь является тот, у которого последняя дата в разделе (ID). Я прокомментировал LAST_VALUE в приведенном ниже запросе, но это, похоже, тоже не работает… не уверен, что я делаю неправильно. Я бы хотел, чтобы результирующий набор данных выглядел следующим образом:
create table #Example (ID int, [Date] datetime, Rating tinyint)
insert into #Example (ID, [Date], Rating)
values
(5227, '2021-01-11 19:21:39.107', 1)
,(128, '2020-06-16 17:32:15.653', 5)
,(128, '2020-06-23 11:35:16.570', 1)
,(2038, '2020-09-14 13:13:48.253', 2)
,(1268, '2020-07-30 16:05:07.950', 0)
,(2398, '2020-09-30 13:51:21.813', 5)
,(2058, '2020-09-14 13:13:48.253', 1)
,(3396, '2020-11-05 12:04:16.043', 5)
,(3396, '2020-12-07 13:23:05.357', 3)
,(3148, '2020-11-05 12:04:16.043', 1)
,(3399, '2020-11-06 12:04:16.043', 2)
,(3399, '2020-12-08 13:23:05.357', 4)
select
exm.ID
, exm.Date
, exm.Rating
--, LAST_VALUE(exm.Rating) over (partition by exm.ID order by exm.Date) as [FinalRating]
from
#Example as exm
drop table #Example
Я был бы очень признателен за любую помощь!
Ответ №1:
Возможно, небольшое изменение вашего запроса будет работать:
create table #Example (ID int, [Date] datetime, Rating tinyint)
insert into #Example (ID, [Date], Rating)
values
(5227, '2021-01-11 19:21:39.107', 1)
,(128, '2020-06-16 17:32:15.653', 5)
,(128, '2020-06-23 11:35:16.570', 1)
,(2038, '2020-09-14 13:13:48.253', 2)
,(1268, '2020-07-30 16:05:07.950', 0)
,(2398, '2020-09-30 13:51:21.813', 5)
,(2058, '2020-09-14 13:13:48.253', 1)
,(3396, '2020-11-05 12:04:16.043', 5)
,(3396, '2020-12-07 13:23:05.357', 3)
,(3148, '2020-11-05 12:04:16.043', 1)
,(3399, '2020-11-06 12:04:16.043', 2)
,(3399, '2020-12-08 13:23:05.357', 4)
select
exm.ID
, exm.Date
, exm.Rating
, last_value(exm.Rating) over (partition by exm.id order by exm.date
rows between current row and unbounded following) as [FinalRating]
from
#Example as exm
order by id, date
Комментарии:
1. Потрясающе, это сработало, спасибо! Можете ли вы рассказать мне больше о том, что делает «строки между текущей строкой и неограниченным следующим»?
2. В Интернете есть много информации об этом. Но в основном в этом сценарии это расширяет окно, на которое смотрит раздел. По умолчанию (так, как у вас было изначально) раздел был ограничен текущей строкой… Вы также можете указать количество строк, чтобы окно смотрело вперед (или назад). Надеюсь, это поможет. Если нет, просто погуглите это, и вы найдете что-то, что объясняет лучше.