PostgreSQL – NTH_VALUE Function
In PostgreSQL, the NTH_VALUE() function is used to get a value from the nth row in a result set.
Here is the syntax of the NTH_VALUE() function:
Syntax:
NTH_VALUE(expression, offset)
OVER (
[PARTITION BY partition_expression]
[ ORDER BY sort_expression [ASC | DESC]
frame_clause ]
)
Let’s analyze the above syntax:
- The expression is the column from which the query is to be made or an expression on which the NTH_VALUE() function operates on.
- The offset is a positive integer that sets the row number according to the first row in the window against the value that the expression evaluates.
- The PARTITION BY clause distributes rows of the result set into partitions to which the NTH_VALUE() function applies.
- The ORDER BY clause is used for sorting the result of the query.
- The frame_clause is used to define the subset (or the frame) of the partition being used.
Example 1:
First, create two tables named grocery and groceries:
CREATE TABLE items(
group_id serial PRIMARY KEY,
group_name VARCHAR (100) NOT NULL
);
CREATE TABLE groceries(
gro_id serial PRIMARY KEY,
gro_name VARCHAR (100) NOT NULL,
price DECIMAL (11, 2),
group_id INT NOT NULL,
FOREIGN KEY (group_id) REFERENCES grocery (group_id)
);
Now add some data to it:
INSERT INTO groceries (group_name)
VALUES
('Cereal'),
('Fruit'),
('Vegetable');
INSERT INTO groceries (group_name, group_id, price)
VALUES
('Wheat', 1, 30),
('Rice', 1, 40),
('Barley', 1, 50),
('Corn', 1, 90),
('Apple', 2, 120),
('Banana', 2, 70),
('Pear', 2, 70),
('Mango', 2, 80),
('Brinjal', 3, 70),
('Capsicum', 3, 150),
('Potato', 3, 20);
The below statement uses the NTH_VALUE() function to return all products together with the most expensive product:
SELECT
product_id,
product_name,
price,
NTH_VALUE(product_name, 2)
OVER(
ORDER BY price DESC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
)
FROM
products;
Output:
Example 2:
The below statement uses the NTH_VALUE() function to return all products with the second most expensive product for each product group:
SELECT
product_id,
product_name,
price,
group_id,
NTH_VALUE(product_name, 2)
OVER(
PARTITION BY group_id
ORDER BY price DESC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
)
FROM
products;
Output:
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape, GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out - check it out now!
Looking for a place to share your ideas, learn, and connect? Our Community portal is just the spot! Come join us and see what all the buzz is about!

