T-SQL получает последнее значение для данной группы

#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. В Интернете есть много информации об этом. Но в основном в этом сценарии это расширяет окно, на которое смотрит раздел. По умолчанию (так, как у вас было изначально) раздел был ограничен текущей строкой… Вы также можете указать количество строк, чтобы окно смотрело вперед (или назад). Надеюсь, это поможет. Если нет, просто погуглите это, и вы найдете что-то, что объясняет лучше.