first_value() over (order by Something asc) 是否应该与 last_value() over (order by so

作者:编程家 分类: sqlserver 时间:2025-09-28

根据 first_value() over (order by Something asc) 和 last_value() over (order by Something desc) 的定义,它们并不一定相同。这是因为这两个窗口函数是基于不同的排序方式进行计算的。

首先,让我们来了解一下这两个窗口函数的作用。first_value()函数用于获取某个列在指定排序方式下的第一个值,而last_value()函数用于获取某个列在指定排序方式下的最后一个值。

假设我们有一个名为"sales"的表,其中包含了销售数据和日期。我们想要找出每个月的第一天和最后一天的销售额。为了实现这个目标,我们可以使用窗口函数来计算每个月的第一天和最后一天的销售额。

首先,我们使用first_value()函数来计算每个月的第一天的销售额。我们将按照日期升序排序,并使用窗口函数来获取每个月的第一天的销售额。示例代码如下:

SELECT date, sales,

first_value(sales) over (PARTITION BY EXTRACT(MONTH FROM date)

ORDER BY date ASC) as first_day_sales

FROM sales;

在这个例子中,我们使用了PARTITION BY子句来按照月份对数据进行分区。然后,我们使用EXTRACT函数来获取每个日期的月份,并将其作为分区的依据。接下来,我们使用ORDER BY子句将日期按照升序排序。最后,我们使用first_value()函数来获取每个月的第一天的销售额。

接下来,让我们使用last_value()函数来计算每个月的最后一天的销售额。我们将按照日期降序排序,并使用窗口函数来获取每个月的最后一天的销售额。示例代码如下:

SELECT date, sales,

last_value(sales) over (PARTITION BY EXTRACT(MONTH FROM date)

ORDER BY date DESC) as last_day_sales

FROM sales;

在这个例子中,我们使用了与上面相同的PARTITION BY子句和EXTRACT函数来分区数据。然而,这次我们使用了降序排序来获取每个月的最后一天的销售额。

使用first_value()和last_value()函数的案例代码:

sql

-- 创建销售表

CREATE TABLE sales (

date DATE,

sales INT

);

-- 插入示例数据

INSERT INTO sales (date, sales)

VALUES

('2022-01-01', 100),

('2022-01-15', 200),

('2022-01-31', 150),

('2022-02-01', 300),

('2022-02-15', 250),

('2022-02-28', 180);

-- 使用first_value()函数计算每个月的第一天的销售额

SELECT date, sales,

first_value(sales) over (PARTITION BY EXTRACT(MONTH FROM date)

ORDER BY date ASC) as first_day_sales

FROM sales;

-- 使用last_value()函数计算每个月的最后一天的销售额

SELECT date, sales,

last_value(sales) over (PARTITION BY EXTRACT(MONTH FROM date)

ORDER BY date DESC) as last_day_sales

FROM sales;

在上面的例子中,我们创建了一个名为"sales"的表,并插入了一些销售数据。然后,我们使用了first_value()和last_value()函数来计算每个月的第一天和最后一天的销售额。结果将按照日期排序,并显示每个月的第一天和最后一天的销售额。

根据上述例子和解释,我们可以得出:first_value() over (order by Something asc) 和 last_value() over (order by Something desc) 并不一定相同。它们根据不同的排序方式来计算并获取不同的值。因此,在使用这两个窗口函数时,我们需要根据实际需求来选择合适的排序方式。