SQL Server中FIRST_VALUE和 LAST_VALUE窗口函数允许在一个指定的窗口内返回第一个或最后一个值

在 SQL Server 中,FIRST_VALUELAST_VALUE 是用于窗口函数(Window Functions)的两个非常有用的函数。它们允许你在一个指定的窗口内返回第一个或最后一个值。这两个函数通常与 OVER 子句一起使用,以定义窗口的范围和排序规则。

语法

FIRST_VALUE

sql 复制代码
FIRST_VALUE (scalar_expression) OVER ([PARTITION BY partition_expression, ...] ORDER BY sort_expression [ASC | DESC], ...)

LAST_VALUE

sql 复制代码
LAST_VALUE (scalar_expression) OVER ([PARTITION BY partition_expression, ...] ORDER BY sort_expression [ASC | DESC], ...)

参数

  • scalar_expression:你想要获取第一个或最后一个值的表达式。
  • PARTITION BY(可选):用于将结果集划分为分区,每个分区独立计算 FIRST_VALUELAST_VALUE
  • ORDER BY:定义窗口内行的排序顺序,这对于确定哪个值是第一个或最后一个至关重要。

示例

假设有一个名为 Sales 的表,其中包含以下数据:

sql 复制代码
CREATE TABLE Sales (
    SaleID INT,
    SaleDate DATE,
    Amount DECIMAL(10, 2)
);

INSERT INTO Sales (SaleID, SaleDate, Amount) VALUES
(1, '2023-01-01', 100.00),
(2, '2023-01-02', 150.00),
(3, '2023-01-03', 200.00),
(4, '2023-01-04', 250.00),
(5, '2023-01-05', 300.00);

使用 FIRST_VALUE

下面的查询将返回每个销售记录的日期,以及按销售日期排序后的第一个销售金额:

sql 复制代码
SELECT
    SaleID,
    SaleDate,
    Amount,
    FIRST_VALUE(Amount) OVER (ORDER BY SaleDate ASC) AS FirstAmount
FROM
    Sales;

结果:

复制代码
SaleID | SaleDate  | Amount | FirstAmount
-------|-----------|--------|------------
1      | 2023-01-01| 100.00 | 100.00
2      | 2023-01-02| 150.00 | 100.00
3      | 2023-01-03| 200.00 | 100.00
4      | 2023-01-04| 250.00 | 100.00
5      | 2023-01-05| 300.00 | 100.00

使用 LAST_VALUE

下面的查询将返回每个销售记录的日期,以及按销售日期排序后的最后一个销售金额:

sql 复制代码
SELECT
    SaleID,
    SaleDate,
    Amount,
    LAST_VALUE(Amount) OVER (ORDER BY SaleDate ASC) AS LastAmount
FROM
    Sales;

结果:

复制代码
SaleID | SaleDate  | Amount | LastAmount
-------|-----------|--------|-----------
1      | 2023-01-01| 100.00 | 300.00
2      | 2023-01-02| 150.00 | 300.00
3      | 2023-01-03| 200.00 | 300.00
4      | 2023-01-04| 250.00 | 300.00
5      | 2023-01-05| 300.00 | 300.00

分区(Partitioning)

你也可以使用 PARTITION BY 子句来将数据划分为多个分区,每个分区独立计算 FIRST_VALUELAST_VALUE。例如,假设 Sales 表中有一个 Region 列,你可以按区域分区:

sql 复制代码
-- 假设 Sales 表中有 Region 列
-- ALTER TABLE Sales ADD Region NVARCHAR(50);
-- UPDATE Sales SET Region = 'North' WHERE SaleID IN (1, 2);
-- UPDATE Sales SET Region = 'South' WHERE SaleID IN (3, 4, 5);

SELECT
    SaleID,
    Region,
    SaleDate,
    Amount,
    FIRST_VALUE(Amount) OVER (PARTITION BY Region ORDER BY SaleDate ASC) AS FirstAmountPerRegion,
    LAST_VALUE(Amount) OVER (PARTITION BY Region ORDER BY SaleDate ASC) AS LastAmountPerRegion
FROM
    Sales;

这将为每个区域返回第一个和最后一个销售金额。

希望这些示例能帮助你理解 FIRST_VALUELAST_VALUE 在 SQL Server 中的用法!

相关推荐
代码的余温14 小时前
SQL Server全链路安全防护
数据库·安全·sqlserver
张人玉18 小时前
SQLSERVER数据备份
数据库·oracle·sqlserver
我想起个名字2 天前
sqlserver2008导入excel表数据遇到的问题
sqlserver·excel
浊尘2 天前
SQL server实现异地增量备份和全量备份
数据库·sqlserver
代码的余温2 天前
SQL Server服务管理
数据库·sqlserver
代码的余温3 天前
解析SQL Server核心服务与功能
数据库·sqlserver
YoungUpUp4 天前
【SQL Server 2022】保姆级SQL Server 详细图文下载安装教程
数据库·sql·sqlserver·sql server·sql server数据库·sql server 2022·sql 数据库
代码的余温4 天前
SQL Server核心架构深度解析
数据库·sqlserver·架构
张人玉4 天前
SQLSERVER基本cmd操作命令
数据库·sqlserver
歪歪1005 天前
SQL Server 数据库创建与用户权限绑定
大数据·数据结构·数据库·sql·oracle·sqlserver·数据库开发