PostgreSQL NTILE Window Function

Window methods in PostgreSQL have been cast off to equate diverge data and are essential for analytical and other PostgreSQL use cases. The NTILE() method followed by the OVER clause in PostgreSQL is discarded to divide organized rows in somewhat like series of graded buckets. Buckets are not anything more than a set of ranked groups. Throughout this article, you’ll discover how to split sorted rows in a partition into a given figure of ranked buckets using the PostgreSQL NTILE() feature. The NTILE() method allocates a bucket number to every group beginning at 1 in a set, demonstrating the set to which the row has its place.


>> NTILE(buckets) OVER ( [PARTITION BY partition expression,... ] [ORDET BY sort expression] ) [ASC | DESC],...]);

First of all, to comprehend the NTILE method, login from the PostgreSQL shell. That’s why try to launch the PostgreSQL command-line shell from the applications. To work on another Server, enter the name of a server; otherwise, hit Enter. If you need to practice on the previously designated database, e.g., Postgres, then press Enter or else, inscribe a databank title, e.g. ‘test’. To use a port other than 5432, inscribe it out; if not, leave it as it is, and hit Enter to carry on. It may request you to enter the username in case you need to shift to a new username. Enter the username; else, just press Enter. Finally, you must put your present user password, to switch using the command-line utilizing that specific user as underneath. Subsequently, effective entries of all the obligatory data, you can start working on NTILE.

To start working on NTILE, you have to create a new table using the CREATE command if you don’t have one. Think through the below-displayed table “employee” in your PostgreSQL database named as ‘test’. This table contains four columns e.g., id, name, age, and salary of an employee of a particular company. Every column has a total of 10 rows , which means 10 records in each column field.

>> SELECT * FROM employee;

At the start, we have to understand the simple concept of fetching records from a table using the ORDER BY clause. We have been executing the below SELECT command without using NTILE to elaborate and understand the concept briefly. We retrieve records for columns; name, age, and salary while sorting the records in the ascending order of field “age”. You can see that it will merely display the records as presented in the image.

>> SELECT name, age, salary FROM employee ORDER BY age;

Use Of NTILE() OVER With ORDER BY Clause:

Assuming the same table “employee”, let’s begin using NTILE() OVER clause in our example. In this example, we have been selecting the two columns; name and salary, while sorting the result related to the ascending order of a column “salary”. The outcome will contain data where the age of an employee is greater than 24 years. We have defined the value of the NTILE bucket as “3” because we want to divide rows into 3 buckets, e.g., 1 to 3. You can see that the rows have been successfully divided into 3 equal buckets, containing 3 rows in each bucket.

>> SELECT name, salary, NTILE(3) OVER( ORDER BY salary ) FROMemployee WHERE age >24’;

Now, let’s take another example while using the same table “employee”. This time, we want to fetch the records of three columns; name, age, and salary using the SELECT query in the command shell. There are slight changes in the WHERE clause. Currently, we have been looking for the records of table “employee” where the age is less than 27 years which will only get the records having age less than 27. On the other hand, there is no change in a bucket value, as it is again 3. Trying the stated command, we have found only three records, equally divided into 3 buckets as displayed in the picture.

>> SELECT name, age, salary, NTILE(3) OVER ( ORDER BY salary ) FROM employee WHERE age <27’;


Let’s have an example of NTILE() OVER while using PARTITION BY and ORDER BY clauses simultaneously. Suppose that the unchanged table “employee” from a database “test” will be used. In this example, you have to select the three columns; name, age, and salary, while sorting in the ascending way of a field “age”. Besides, we have been using the PARTITION BY clause on the column “salary”, to make partitions of a table according to this column. There is no specific condition that has been used in this particular query which means all records of table “employee” will be displayed. The NTILE bucket has a value of “3”. On the execution of the below-stated query, you will see the below outcome. The partitions are done according to the distinct values of column “salary”. All the values of column “salary” are distinct, that’s why it lies in different partitions except the value “60000”. This means every partition got 1 value except one. After that, all the partition rows got ranked through buckets. Only one bucket got the 2nd rank.

>> SELECT name, age, salary, NTILE(3) OVER( PARTITION BY salary, ORDER BY age ) FROM employee;

Taking the same example of NTILE() OVER with the use of PARTITION BY and ORDER BY clause with a WHERE clause. In the WHERE clause, we have defined the condition, which says that the only records that will be fetched are where the age of the employee is less than 27 years. We only got 3 results having 2 partitions according to age and “ntile” column with ranks.

>> SELECT name, age, salary, NTILE(3) OVER( PARTITION BY salary, ORDER BY age ) FROM employee WHERE age <27’;


In this guide, we have discussed different examples of ntile functions. You can implement them as per your necessity.

About the author

Aqsa Yasin

I am a self-motivated information technology professional with a passion for writing. I am a technical writer and love to write for all Linux flavors and Windows.