SQL Server LAST_VALUE() Function
The LAST_VALUE()
function is a window function in SQL Server used to retrieve the last value in a group. This function can be used in a SELECT statement to return the last value for each row in a group. The LAST_VALUE()
function must be used with an OVER clause.
Syntax
The syntax for the LAST_VALUE()
function is as follows:
LAST_VALUE(expression) OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY order_expression [ASC | DESC]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
where:
expression
: specifies the column or expression to return the last value of.PARTITION BY
: optional, specifies the column or expression to group by.ORDER BY
: specifies the column or expression to sort rows within each partition.ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
: specifies the window size to compute the last value for each row.
Usage
The LAST_VALUE()
function is typically used to retrieve the last value in a group. For example, if there is a table containing order history records, we can use the LAST_VALUE()
function to retrieve the final status of each order. Additionally, the LAST_VALUE()
function can also be used to handle time-series data to retrieve the last value for each time period.
Examples
Example 1
Suppose there is a table named sales
with the following data:
order_id | product_id | sales |
---|---|---|
1 | A | 100 |
2 | A | 200 |
3 | B | 300 |
4 | B | 400 |
5 | B | 500 |
We can use the LAST_VALUE()
function to retrieve the last sales for each product. The following query and result:
SELECT DISTINCT
product_id,
LAST_VALUE(sales) OVER (PARTITION BY product_id ORDER BY order_id) AS last_sales
FROM sales;
Results:
product_id | last_sales |
---|---|
A | 200 |
B | 500 |
Example 2
Suppose there is a table named stocks
with the following data:
date | stock_code | price |
---|---|---|
2022-01-01 | A | 10 |
2022-01-02 | A | 20 |
2022-01-03 | A | 30 |
2022-01-01 | B | 5 |
2022-01-02 | B | 15 |
2022-01-03 | B | 25 |
We can use the LAST_VALUE()
function to retrieve the last price for each stock code. The following query and result:
SELECT DISTINCT
stock_code,
LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date) AS last_price
FROM stocks;
Results:
stock_code | last_price |
---|---|
A | 30 |
B | 25 |
Assuming we want to obtain the last price and the previous day’s price for each stock code. To do this, we can add the ROWS BETWEEN clause to the LAST_VALUE()
function and set it to UNBOUNDED PRECEDING and 1 PRECEDING. This way, we can get the last and previous values for each row. The following is the query statement and result:
SELECT DISTINCT
stock_code,
LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_price,
LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date) AS last_price
FROM stocks;
Query Result:
stock_code | prev_price | last_price |
---|---|---|
A | NULL | 20 |
A | 20 | 30 |
B | NULL | 15 |
B | 15 | 25 |
In the query result above, we can see the last price and the previous day’s price for each stock code. Since there is no previous day’s price on the first day, a NULL value is displayed in the prev_price column.
Conclusion
The LAST_VALUE()
function is a useful tool in SQL Server for obtaining the last value in a grouping. It can help us process tables containing time-series data and find the last value for each time period. When using the LAST_VALUE()
function, it is important to specify parameters such as grouping, sorting, and window size to ensure that the correct results are obtained.