I want to produce query result base on this scenario that can create row number according to crew_id and type.
id crew_id amount type
1 4
The question is quite old. But I would like to post it in case someone will have a same problem.
First of all, described answers do not work correct. For example, for
id crew_id amount type
1 4 1000 AUB
2 4 1500 AUB
5 5 1000 AUB
6 6 3000 AUB
8 6 3500 AUB
9 4 5000 AUB
(I just removed rows with type 'CA') the result table will be
id crew_id amount rank type
1 4 1000 1 AUB
2 4 1500 2 AUB
9 4 5000 3 AUB
5 5 1000 4 AUB
6 6 3000 5 AUB
8 6 3500 6 AUB
So in fact it doesn't use both crew_id and type, it just uses type.
Here is how I solved this problem (probably there is a more elegant way to do it than use two nested 'CASE's, but you get the idea):
SELECT id,
amount,
CASE crew_id
WHEN @curCrewId THEN
CASE type
WHEN @curType THEN @curRow := @curRow + 1
ELSE @curRow := 1
END
ELSE @curRow :=1
END AS rank,
@curCrewId := crew_id AS crew_id,
@curType := type AS type
FROM Table1 p
JOIN (SELECT @curRow := 0, @curCrewId := 0, @curType := '') r
ORDER BY crew_id, type
The main idea remain. I just added a variable @curCrewId. If someone need to use 3 variables for grouping, so just use 3 variables and 3 nested 'CASE's. :)