I know this question already was made several times, but it's always in some complex context or teoricaly incomplete.
I'm looking for a general answer like a math formula to serve for me and for future searches too.
So, let's see the table bellow...
col_a | col_b | prt_x | prt_y | ord_u | ord_w
-------+--------+--------+--------+--------+--------
row_a1 | row_b1 | row_x1 | row_y1 | row_u1 | row_w1
row_a2 | row_b2 | row_x2 | row_y2 | row_u2 | row_w2
row_a3 | row_b3 | row_x3 | row_y3 | row_u3 | row_w3
row_a4 | row_b4 | row_x4 | row_y4 | row_u4 | row_w4
And let's say that we want rewrite the the commands bellow for MySQL V5.7.
1 - ROW_NUMBER WITH ONE PARTITION BY
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x)
FROM tbl
SOLUTION:
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x, @row_num + 1, 1) AS R,
@part1 := prt_x
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL) AS tbl_aux
2 - ROW_NUMBER WITH TWO PARTITION BY
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x, prt_y)
FROM tbl
SOLUTION:
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x AND @part2=prt_y, @row_num + 1, 1) AS ROW_NUMBER,
@part1 := prt_x,
@part2 := prt_y
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL, @part2 := NULL) AS tbl_aux
3 - ROW_NUMBER WITH ONE ORDER BY
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x, prt_y, ORDER BY ord_u)
FROM tbl
SOLUTION:
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x AND @part2=prt_y, @row_num + 1, 1) AS ROW_NUMBER,
@part1 := prt_x,
@part2 := prt_y
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL, @part2 := NULL) AS tbl_aux ORDER BY ord_u ASC
4 - ROW_NUMBER WITH TWO ORDER BY
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x, prt_y, ORDER BY ord_u, ord_v)
FROM tbl
SOLUTION
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x AND @part2=prt_y, @row_num + 1, 1) AS ROW_NUMBER,
@part1 := prt_x,
@part2 := prt_y
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL, @part2 := NULL) AS tbl_aux ORDER BY ord_u ASC, ord_v ASC
5 - ROW_NUMBER WITH ORDER BY RAND
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x, prt_y, ORDER BY ord_u, RAND())
FROM tbl
SOLUTION:
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x AND @part2=prt_y, @row_num + 1, 1) AS ROW_NUMBER,
@part1 := prt_x,
@part2 := prt_y
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL, @part2 := NULL) AS tbl_aux ORDER BY ord_u ASC, RAND()
6 - ROW_NUMBER WITH ORDER BY MOD
SELECT col_a, col_b, ROW_NUMBER() OVER(PARTITION BY prt_x, prt_y, ORDER BY ord_u, MOD(n1, n2))
FROM tbl
SOLUTION:
SELECT
col_a,
col_b,
@row_num := IF(@part1=prt_x AND @part2=prt_y, @row_num + 1, 1) AS ROW_NUMBER,
@part1 := prt_x,
@part2 := prt_y
FROM tbl
CROSS JOIN (SELECT @row_num := 1, @part1 := NULL, @part2 := NULL) AS tbl_aux ORDER BY ord_u ASC, MOD(n1, n2)