SQLite row_number() Function
The SQLite row_number() function returns the ordinal number, starting from 1, of the partition in which the current row is located.
row_number() Syntax
Here is the syntax of the SQLite row_number() function:
row_number()
OVER (
[PARTITION BY partition_column_list]
[ORDER BY order_column_list]
)
Parameters
partition_column_list-
List of columns for partitioning.
partition_column_list-
List of columns for sorting.
Return value
The SQLite row_number() function returns the ordinal number, starting from 1, of the partition in which the current row is located.
row_number() Examples
Preparing Data
Use the following CREATE TABLE statement to create a table named student_grade to store grades of students:
CREATE TABLE student_grade (
id INTEGER PRIMARY KEY,
name VARCHAR(50) NOT NULL,
class CHAR(1) NOT NULL,
subject VARCHAR(20) NOT NULL,
grade INT NOT NULL
);
This student_grade table has 5 columns as following:
id- The row ID, primary key.name- The name of a student.class- The class a student is in.subject- The name of a subject.grade- The grades for a subject and a student.
Insert some rows into the student_grade table using the following INSERT statement:
INSERT INTO student_grade
(name, class, subject, grade)
VALUES
('Tim', 'A', 'Math', 9),
('Tom', 'A', 'Math', 7),
('Jim', 'A', 'Math', 8),
('Tim', 'A', 'English', 7),
('Tom', 'A', 'English', 8),
('Jim', 'A', 'English', 7),
('Lucy', 'B', 'Math', 8),
('Jody', 'B', 'Math', 6),
('Susy', 'B', 'Math', 9),
('Lucy', 'B', 'English', 6),
('Jody', 'B', 'English', 7),
('Susy', 'B', 'English', 8);
Use the following SELECT statement to show all rows in this table:
SELECT * FROM student_grade;
id name class subject grade
-- ---- ----- ------- -----
1 Tim A Math 9
2 Tom A Math 7
3 Jim A Math 8
4 Tim A English 7
5 Tom A English 8
6 Jim A English 7
7 Lucy B Math 8
8 Jody B Math 6
9 Susy B Math 9
10 Lucy B English 6
11 Jody B English 7
12 Susy B English 8Example 1
To show the row number of each student in each subject in descending order of grade, use the following statement:
SELECT *,
row_number() OVER (
PARTITION BY subject
ORDER BY grade DESC
) row_number
FROM student_grade;
id name class subject grade row_number
-- ---- ----- ------- ----- ----------
5 Tom A English 8 1
12 Susy B English 8 2
4 Tim A English 7 3
6 Jim A English 7 4
11 Jody B English 7 5
10 Lucy B English 6 6
1 Tim A Math 9 1
9 Susy B Math 9 2
3 Jim A Math 8 3
7 Lucy B Math 8 4
2 Tom A Math 7 5
8 Jody B Math 6 6Note that the window function in the SQL statement above:
row_number() OVER (
PARTITION BY subject
ORDER BY grade DESC
)
In the OVER clause,
- The
PARTITION BY subjectpartitions all rows by subject - The
ORDER BY gradesorts all rows within each partition in ascending order by grade. - The
row_number()returns the row number of each row within its associated partition.
Example 2
To show the row number of each student in each class in descending order of total grade, use the following statement:
SELECT t.*,
row_number() OVER (
PARTITION BY class
ORDER BY t.sum_grade DESC
) row_number
FROM (
SELECT class,
name,
sum(grade) sum_grade
FROM student_grade
GROUP BY class, name
) t;
class name sum_grade row_number
----- ---- --------- ----------
A Tim 16 1
A Jim 15 2
A Tom 15 3
B Susy 17 1
B Lucy 14 2
B Jody 13 3Notice this subquery in the above statement:
SELECT class,
name,
sum(grade) sum_grade
FROM student_grade
GROUP BY class, name
This subquery uses the GROUP BY clause and the sum() function sums up each student’s total grade by class and student.
class name sum_grade
----- ---- ---------
A Jim 15
A Tim 16
A Tom 15
B Jody 13
B Lucy 14
B Susy 17The main statement partitions all rows from this subquery by classes, then sort by total grade in descending order within each partition, and gets the row number of each row within its associated partition using row_number().