使用SQL函数FIRST\u value获取最后一个值
是否可以使用SQL函数使用SQL函数FIRST\u value获取最后一个值,sql,sql-server,function,sql-server-2016,Sql,Sql Server,Function,Sql Server 2016,是否可以使用SQL函数FIRST_value获取排序变量的最后一个值?下面是获取最后一个值的方法 select [MyVal_Last] = FIRST_VALUE([MyValue]) OVER (PARTITION BY [Category] ORDER BY [MyValue] DESC) from tbl 是否可以修改它以获得倒数第二个值 更新。我熟悉获取最后提到的一个值的不同方法,即这些答案是旧的,并且留着长胡子。我想知道新版本的SQL Server是否可以通过使用新函数以更优雅
FIRST_value
获取排序变量的最后一个值?下面是获取最后一个值的方法
select
[MyVal_Last] = FIRST_VALUE([MyValue]) OVER (PARTITION BY [Category] ORDER BY [MyValue] DESC)
from tbl
是否可以修改它以获得倒数第二个值
更新。我熟悉获取最后提到的一个值的不同方法,即这些答案是旧的,并且留着长胡子。我想知道新版本的SQL Server是否可以通过使用新函数以更优雅的方式实现这一点。您还可以使用偏移量获取函数来获取最后一行
SELECT
*
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY [Category]
ORDER BY [MyValue] DESC) AS ordinal
FROM
tbl
)
ordered_tbl
WHERE
ordinal = 2
CREATE TABLE Cinema
([CinemaID] int, [Name] varchar(7))
;
INSERT INTO Cinema
([CinemaID], [Name])
VALUES
(1, 'Odeon'),
(2, 'Mercury'),
(3, 'Apollo'),
(4, 'Venus')
;
SELECT c.*
FROM dbo.Cinema AS c
ORDER BY CinemaID DESC
OFFSET 1 ROW
FETCH FIRST 1 ROW ONLY ;
好的,我找到了。功能
LAG
在2017年完成工作。我不知道它是否是最有效的,但它足够好,因为简单性很重要
[MyVal_Last] = LAG([MyValue],1) OVER (PARTITION BY [Category] ORDER BY [MyValue] ASC)
非常感谢。请参阅更新。你不认为你的答案虽然正确,但对2017年来说似乎太长了吗?不,我不认为。它是使用SQL中可用的语法结构最直接地表达问题语句的方法。如果索引正确,它也是性能最好的。如果SQL SERVER具有Qualife关键字(在Teradata中存在),则可以删除子查询以减少文本量,但执行计划将是相同的。行编号中的排序不应该是DESC以查找最后一个,而不是一个吗?我的错误。我读到你的帖子时说“这是第一个,我要最后一个”,所以我颠倒了你从最后一个中选择第二个的顺序。原来你自己已经颠倒了顺序,使用了
FIRST\u VALUE()
,这有点违反直觉(不知道你为什么不直接使用LAST\u VALUE()
和按ASC排序)。看起来不错。赞扬避免了像row_number()方法中那样可怕的子查询。它适用于类别组吗?你所说的“类别组”是什么意思?你希望每个类别都有第二行?比如说Odeon和Mercury是类别1。阿波罗和金星是第二类。对于每个类别,我只需要最后一个值。不,那么您必须使用子查询,如分区方式。“可怕的子查询”的概念是基于对SQL(一种声明性语言)如何转换为执行计划的误解。如果子查询存在性能问题,则由于误用,在没有子查询的情况下同样可能出现。例如在连接中混淆搜索谓词,防止用户使用索引进行搜索操作。这与您描述的不同。它获取上一行的值。因此,在一组10行中,第一行为空,第二行为第一行的值,第三行为第二行的值……第十行为第九行的值。