FIRST_VALUE、LAST_VALUE、LAG与LEAD都是MAXCOMPUTE的窗口函数。其中,FIRST_VALUE函数返回指定表达式的第一个值,通常用于在每个分区内按某种顺序返回第一个值。基本语法如下:
FIRST_VALUE(column_name) OVER (PARTITION BY ... ORDER BY ...);
其中,column_name表示为要返回第一个值的列名;PARTITION BY将数据集分成多个分区,每个分区独立进行计算;ORDER BY则指定排序规则,以确定哪个值是“第一个”。
其示例如下:
# 找出每个产品的第一次销售日期及其销售金额。
SELECT
product_id,
date,
amount,
FIRST_VALUE(date) OVER (PARTITION BY product_id ORDER BY date ASC) AS fst_sale_date,
FIRST_VALUE(amount) OVER (PARTITION BY product_id ORDER BY date ASC) AS fst_sale_amount
FROM
table_sales;
LAST_VALUE函数与FIRST_VALUE函数相反,其旨在返回指定表达式的最后一个值。基本语法如下:
LAST_VALUE(column_name) OVER (PARTITION BY ... ORDER BY ...);
LAG函数返回当前行前一行的值,可用于比较当前行与前一行的数据。基本语法如下:
LAG(column_name, offset, [default_value]) OVER (PARTITION BY ... ORDER BY ...);
其中,column_name表示为要返回前一行值的列名;offset为偏移量,默认为1,表示前一行。
default_value可选,默认值为NULL,当找不到前一行时,返回该默认值;PARTITION BY将数据集分成多个分区,每个分区独立进行计算;ORDER BY则指定排序规则,以确定哪一行是“前一行”。
其示例如下:
# 找出每个客户的上一笔交易的金额。
SELECT
customer_id,
transaction_id,
transaction_date,
amount,
LAG(amount, 1) OVER (PARTITION BY customer_id ORDER BY transaction_date) AS pre_amount
FROM
table_transactions;
LEAD函数返回当前行后续行的值,可以用于比较当前行与后一行的数据。基本语法如下:
LEAD(column_name, offset, [default_value]) OVER (PARTITION BY ... ORDER BY ...);
通过组合使用这些函数,我们可以获得数据序列中的前后关系、首次出现和最后一次出现等信息,从而帮助我们更灵活地处理数据。