ROW_NUMBER(): Assigns a unique number to each row starting from 1, based on the order specified in the ORDER BY clause. If two rows are equal based on the ORDER BY criteria, they will still receive different row numbers, essentially making it a sequential numbering.
RANK(): Assigns a rank to each row with the same rank for tie values, but the next rank will be incremented based on the total number of ties. For example, if two rows tie for rank 1, the next row will have rank 3.
DENSE_RANK(): Similar to RANK(), but without gaps in the rank values. Following the previous example, if two rows tie for rank 1, the next row will have rank 2.