sql 开窗后取第一条跟最后一条
时间: 2025-05-25 21:12:18 浏览: 7
### SQL 开窗函数获取分区中的第一条记录和最后一条记录
在 SQL 中,可以使用开窗函数 `ROW_NUMBER()` 来为每一行分配唯一的编号,并通过条件筛选出分区内的第一条记录或最后一条记录。以下是具体实现方式:
#### 获取分区中的第一条记录
为了获取分区中的第一条记录,可以按照以下逻辑操作:
1. 使用 `ROW_NUMBER()` 函数为每一行分配唯一编号。
2. 按照指定列(通常是时间戳或其他排序依据)升序排列。
3. 对于每个分区,保留编号为 1 的记录。
代码示例如下:
```sql
WITH RankedData AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY PartitionColumn ORDER BY SortColumn ASC) AS RowNum
FROM YourTable
)
SELECT *
FROM RankedData
WHERE RowNum = 1;
```
此查询会返回每个分区的第一条记录[^1]。
---
#### 获取分区中的最后一条记录
对于获取分区中的最后一条记录,可以采用类似的逻辑:
1. 同样使用 `ROW_NUMBER()` 函数为每一行分配唯一编号。
2. 这次按照指定列降序排列。
3. 对于每个分区,同样保留编号为 1 的记录。
代码示例如下:
```sql
WITH RankedData AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY PartitionColumn ORDER BY SortColumn DESC) AS RowNum
FROM YourTable
)
SELECT *
FROM RankedData
WHERE RowNum = 1;
```
此查询会返回每个分区的最后一条记录[^1]。
---
#### 结合 MAX 和 MIN 实现类似功能
如果目标数据库不支持 `FIRST_VALUE` 或 `LAST_VALUE` 等窗口函数,则可以通过组合其他聚合函数来模拟这些行为。例如,在 MySQL 中,可以借助子查询和 `MAX/MIN` 函数完成类似效果[^2]。
代码示例如下:
```sql
-- 获取分区中的第一条记录
SELECT t.*
FROM YourTable t
JOIN (
SELECT PartitionColumn, MIN(SortColumn) AS MinSortValue
FROM YourTable
GROUP BY PartitionColumn
) sub ON t.PartitionColumn = sub.PartitionColumn AND t.SortColumn = sub.MinSortValue;
-- 获取分区中的最后一条记录
SELECT t.*
FROM YourTable t
JOIN (
SELECT PartitionColumn, MAX(SortColumn) AS MaxSortValue
FROM YourTable
GROUP BY PartitionColumn
) sub ON t.PartitionColumn = sub.PartitionColumn AND t.SortColumn = sub.MaxSortValue;
```
这种方法适用于某些不完全支持标准窗口函数的数据库环境[^3]。
---
### 总结
- **第一条记录**:基于升序排列并选取 `Row_Number=1` 的记录。
- **最后一条记录**:基于降序排列并选取 `Row_Number=1` 的记录。
- 如果无法直接使用窗口函数,可通过子查询结合 `MIN/MAX` 达到相同目的。
阅读全文
相关推荐


















