MS SQL LAST_VALUE () Сортировать по - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно выбрать последнее значение для group_id, упорядоченного по id из следующей примерной таблицы:

drop table if exists #temp1
create table #temp1 (group_id int, id int, val varchar(10))
insert into #temp1 values (1111, 1, 'Yes')
insert into #temp1 values (1111, 2, 'No')
insert into #temp1 values (1111, 3, NULL)
insert into #temp1 values (2222, 5, 'No')
insert into #temp1 values (2222, 3, NULL)
insert into #temp1 values (2222, 1, 'No')

Ожидаемый результат: 1111 - Yes и 2222 - No.

Если я напишу следующий запрос, он, похоже, выберет последнее значение в зависимости от того, как строки упорядочены в таблице, а не по столбцу id.

SELECT group_id, MAX(last_val)
FROM
(
    SELECT a.group_id, LAST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.group_id) AS last_val FROM #temp1 a
) a
GROUP BY group_id

Если я напишу следующее, кажется, он делает Max из val по алфавиту:

SELECT group_id, MAX(last_val)
FROM
(
    SELECT a.group_id, LAST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.id) AS last_val FROM #temp1 a
) a
GROUP BY group_id

В обоих случаях результаты отличаются от того, что мне нужно. Может кто-нибудь подсказать, как получить val за последний id?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Во-первых, я рекомендую FIRST_VALUE() с сортировкой по убыванию. Затем вам нужно использовать правый столбец ORDER BY:

SELECT group_id, MAX(last_val)
FROM (SELECT a.group_id,
             FIRST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.id DESC) AS last_val
      FROM #temp1 a
     ) a
GROUP BY group_id;

Почему я предпочитаю FIRST_VALUE() для этого? Проблема заключается в рамке окна по умолчанию, которая равна BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Это может неожиданно взаимодействовать с LAST_VALUE().

1 голос
/ 03 августа 2020

Почему вы группируетесь дважды? не могли бы вы просто изменить окно?

SELECT DISTINCT 
    a.group_id
    ,FIRST_VALUE(a.val) OVER (PARTITION BY a.group_id 
                              ORDER BY a.id DESC 
                              ROWS BETWEEN 
                              UNBOUNDED PRECEDING AND 
                              UNBOUNDED FOLLOWING) AS last_val
FROM #temp1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...