Skip to main content

SQLite n_值函数的实例分析

SQLite n_VALUE()函数是一个窗口函数,允许您获取指定窗口帧中第n行的值。

下面是n_VALUE()函数的语法:

NTH_VALUE(expression, N) 
OVER (
PARTITION BY expression1, expression2,...
ORDER BY expression1 [ASC | DESC], expression2,..
frame_clause
)

在这种语法中:

表示

是针对窗口框架中的第n行计算的任何有效表达式。表达式必须返回单个值。表达式中不允许使用子查询或其他窗口函数。

N

指定frame_子句指定的窗口框架中的第n行。N必须是正整数,例如1、2和3。

请注意,如果第n行不存在,则第n_VALUE()函数将返回NULL。

分割

PARTITION BY子句将行划分为分区a,第n_VALUE()函数适用于分区a。partitionby子句是可选的。如果省略它,默认情况下,n_VALUE()函数将把整个结果集视为一个分区。

订购人

ORDER BY子句指定应用第n_VALUE()函数的每个分区中的行顺序。

框架条款

frame_子句定义当前分区的子集(或框架)。有关frame子句的更多详细信息,请查看窗口frame子句教程。

FROM FIRST命令第n_VALUE()函数在窗口框架的第一行开始计算。

请注意,SQL标准支持FROM FIRST和FROM LAST子句,如下所示:

NTH_VALUE(expression, N) 
FROM {FIRST | LAST}
OVER (
PARTITION BY expression1, expression2,...
ORDER BY expression1 [ASC | DESC], expression2,..
frame_clause
)

然而,SQLite只隐式支持第一种行为。通过按顺序颠倒顺序,可以实现“从上一个开始”的效果。

此外,SQL标准为第n_VALUE()函数定义了尊重null或忽略null选项。然而,这个特性并没有在SQLite中实现。默认行为始终与SQ标准的默认行为相同,即尊重空值。

SQLite n_VALUE()函数示例

请参见示例数据库中的以下轨迹表:

对结果集使用SQLite n_VALUE()函数

下面的语句使用第n_VALUE()函数返回所有曲目,以及曲目表中的第二长曲目:

SELECT
Name,
Milliseconds Length,
NTH_VALUE(name,2) OVER (
ORDER BY Milliseconds DESC
) SecondLongestTrack
FROM
tracks;

以下是部分输出:

SQLite Nth_Value Over Result Example

在本例中,ORDER BY子句按照轨迹的长度按升序对from子句派生的结果集进行排序,而NTH_VALUE()函数返回结果集中的第二行,即第二长轨迹。

在分区上使用SQLite n_VALUE()函数

以下示例查找每个专辑中第二长的曲目:

SELECT
AlbumId,
Name,
Milliseconds Length,
NTH_VALUE ( Name,2 ) OVER (
PARTITION BY AlbumId
ORDER BY Milliseconds DESC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) AS SecondLongestTrack
FROM
tracks;

下图显示了部分输出:

SQLite Nth_Value Over Partition Example

在本例中:

在本教程中,您学习了如何使用SQLite NTH_VALUE()函数从指定的窗口帧获取第n行的值。