The FIRST_VALUE
function returns the first value in a result set.
Multiple groups can be created by partioning the result set.
In that case, FIRST_VALUE
returns the first value inside each group.
List products with pricing. In each row, add lowest and highest prices.
SELECT ProductName,
FIRST_VALUE(UnitPrice) OVER (ORDER BY UnitPrice) AS Low,
UnitPrice AS Price,
FIRST_VALUE(UnitPrice) OVER (ORDER BY UnitPrice DESC) AS High
FROM Product
Unit prices appear between the lowest and the highest prices.
ProductName | Low | Price | High |
---|---|---|---|
Côte de Blaye | 2.50 | 263.50 | 263.50 |
Thüringer Rostbratwurst | 2.50 | 123.79 | 263.50 |
Mishi Kobe Niku | 2.50 | 97.00 | 263.50 |
Sir Rodney's Marmalade | 2.50 | 81.00 | 263.50 |
Carnarvon Tigers | 2.50 | 62.50 | 263.50 |
Note: By sorting in DESC order, the FIRST_VALUE
acts like a
LAST_VALUE function.
Syntax of the FIRST_VALUE function.
FIRST_VALUE(scalar-expression) OVER( PARTITION BY expression, ... ORDER BY expression, ... )
scalar-expression
-- a column, subquery, or expression evaluated into single value.
PARTITION BY expression, ...
-- optional. Organizes rows into different groups where the FIRST_VALUE
will be applied. If not specified, the entire result set represents a single group.
ORDER BY expression
-- sets the sort order of the result set.
ORDER |
---|
Id |
OrderDate |
OrderNumber |
CustomerId |
TotalAmount |
CUSTOMER |
---|
Id |
FirstName |
LastName |
City |
Country |
Phone |
SELECT MONTH(OrderDate) AS Month,
CONCAT(FirstName, ' ', LastName) AS Customer,
FIRST_VALUE(TotalAmount) OVER(PARTITION BY MONTH(OrderDate)
ORDER BY TotalAmount) AS 'Lowest Monthly Sale',
TotalAmount,
FIRST_VALUE(TotalAmount) OVER(PARTITION BY MONTH(OrderDate)
ORDER BY TotalAmount DESC) AS 'Highest Monthly Sale'
FROM [Order] O
JOIN Customer C ON O.CustomerId = C.Id
WHERE YEAR(OrderDate) = 2013
Month | Customer | Lowest Monthly Sale | TotalAmount | Highest Monthly Sale |
---|---|---|---|---|
1 | Jean Fresnière | 49.80 | 11493.20 | 11493.20 |
1 | Jytte Petersen | 49.80 | 11283.20 | 11493.20 |
1 | Roland Mendel | 49.80 | 5796.00 | 11493.20 |
2, 3, 4, ... 11 | ||||
12 | Pascale Cartrain | 12.50 | 28.00 | 6984.50 |
12 | Paolo Accorti | 12.50 | 18.40 | 6984.50 |
12 | Patricio Simpson | 12.50 | 12.50 | 6984.50 |