如何在SQL Server中使用滞后函数

349 阅读3分钟

SQL Server中的滞后函数是SQL Server 2012中引入的一个窗口函数。这个函数允许你按照指定的偏移值来获取前几行的数据。可以把滞后函数看作是从当前行访问前几行数据的能力。

例如,从当前行,你可以访问前一行,成为当前行,你可以访问前一行,以此类推。

在这篇文章中,我们将通过各种例子学习如何在SQL Server中使用滞后函数。

SQL Server LAG()函数

我们将该函数的语法表述为。

lag(expression, offset [,DEFAULT])
OVER (
        [partition BY partition_by_expression]
        order_by_clause
)

函数参数和返回值

在上面的语法中,我们有以下参数。

  1. Expression- 滞后函数用来进行计算的列或表达式。这是一个必要参数,表达式必须返回一个单一的值。
  2. Offset- 一个正整数值,定义滞后函数将检索多少行。如果没有指定,默认值被设置为1。
  3. Default- 如果指定的偏移值超出了分区的范围,指定了函数返回的默认值。默认情况下,该函数返回NULL。
  4. Partition_by_expression- 一个用于创建逻辑数据分区的表达式。SQL Server将对产生的分区集应用滞后函数。
  5. Order_by_clause- 一个表达式,用于定义如何对产生的分区中的行进行排序。

该函数返回标量表达式的数据类型。

SQL服务器滞后实例

让我们看一个实际的例子来更好地理解如何使用滞后函数。让我们从添加样本数据开始,如图所示。

CREATE DATABASE sampledb;
GO
USE sampledb;
CREATE TABLE lag_func(
        id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
        dbname VARCHAR(50),
        paradigm VARCHAR(50),
);
INSERT INTO lag_func(dbname, paradigm)
VALUES ('MySQL', 'Relational'),
           ('MongoDB', 'Document'),
           ('Memcached', 'Key-Value Store'),
           ('Etcd', 'Key-Value Store'),
           ('Apache Cassandra', 'Wide Column'),
           ('CouchDB', 'Document'),
           ('PostgreSQL', 'Relational'),
           ('SQL Server', 'Relational'),
           ('neo4j', 'Graph'),
           ('Elasticsearch', 'Full-Text');
SELECT * FROM lag_func;

上面的查询集应该返回数据为。

在dbname列上运行滞后函数,如下面的查询示例所示。

SELECT *, lag(dbname, 1) OVER (ORDER BY dbname) AS previous_db FROM lag_func;

上面的查询返回一个输出为。

注意,第一行包含一个空值,因为它没有前一个值。

例2:

我们可以设置一个缺省值,而不是得到一个空值,因为该行不包含以前的记录,如下面的查询示例所示。

SELECT dbname, lag(dbname, 1, 'N/A')
OVER (ORDER BY dbname) AS previous_db
FROM lag_func;

上面的查询返回与上面类似的输出。但是,我们得到的不是NULL,而是指定的字符串。

例3:自定义偏移值

我们也可以在一个自定义的偏移值上获取数值。例如,为了获取之前三条记录的值,我们可以使用这样的查询。

SELECT dbname, lag(dbname, 3, 'N/A')
OVER (ORDER BY dbname) AS previous_db
FROM lag_func;

上面的示例代码应该返回结果为。

这里,前3列是空的,因为偏移值超过了可用行的范围。

例子4:分区

我们可以使用partition by子句来创建相关数据的逻辑分区。然后我们可以对每个分区应用滞后函数。

请看下面的例子:

SELECT dbname, paradigm, lag(dbname, 1, 'N/A')
OVER (partition BY paradigm ORDER BY dbname) AS previous_db
FROM lag_func;

上面的查询返回一个示例查询集为。

该查询根据上述结果中的范式创建了6个分区。在每个分区中,滞后函数获取前一行。

总结

这篇文章教你如何使用SQL Server的滞后函数从结果集中获取前一行。

谢谢你的阅读!