Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL函数FIRST\u value获取最后一个值_Sql_Sql Server_Function_Sql Server 2016 - Fatal编程技术网

使用SQL函数FIRST\u value获取最后一个值

使用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是否可以通过使用新函数以更优雅

是否可以使用SQL函数
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行中,第一行为空,第二行为第一行的值,第三行为第二行的值……第十行为第九行的值。