首页 > 解决方案 > MS SQL LAST_VALUE() 排序依据

问题描述

我需要从以下示例表中选择group_idorder by的最后一个值: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 - Yes2222 - 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

如果我写以下内容,它似乎Maxval字母顺序执行:

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吗?

标签: sqlsql-server

解决方案


首先,我建议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().


推荐阅读