[英]Row number per group in mysql
I want to produce query result base on this scenario that can create row number according to crew_id and type.我想根据这个场景生成查询结果,可以根据crew_id和type创建行号。
id crew_id amount type
1 4 1000 AUB
2 4 1500 AUB
3 5 8000 CA
4 4 1000 CA
5 5 1000 AUB
6 6 3000 AUB
7 4 2000 CA
8 6 3500 AUB
9 4 5000 AUB
10 5 9000 CA
11 5 1000 CA
OUTPUT must be the ff: OUTPUT 必须是 ff:
id crew_id amount type row_number
1 4 1000 AUB 1
2 4 1500 AUB 2
9 4 5000 AUB 3
4 4 1000 CA 1
7 4 2000 CA 2
5 5 1000 AUB 1
3 5 8000 CA 1
10 5 9000 CA 2
11 5 1000 CA 3
6 6 3000 AUB 1
6 6 3000 AUB 2
I want a single select statement only in this output我只想要这个输出中的单个 select 语句
Please go through my fiddle请通过我的小提琴
SELECT id,
crew_id,
amount,
type,
(
CASE type
WHEN @curType
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curType := type END
) + 1 AS rank
FROM Table1 p,
(SELECT @curRow := 0, @curType := '') r
ORDER BY crew_id,type asc;
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 (我刚刚删除了类型为“CA”的行)结果表将是
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.所以实际上它并没有同时使用crew_id 和type,它只使用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):这是我解决这个问题的方法(可能有一种比使用两个嵌套的“CASE”更优雅的方法,但你明白了):
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.我刚刚添加了一个变量@curCrewId。 If someone need to use 3 variables for grouping, so just use 3 variables and 3 nested 'CASE's.如果有人需要使用 3 个变量进行分组,那么只需使用 3 个变量和 3 个嵌套的“CASE”。 :) :)
@Janty's answer does not work when the type starts with a number (the rank starts at 2 instead of 1).当类型以数字开头(排名从 2 而不是 1 开始)时,@Janty 的答案不起作用。
Use the following instead:请改用以下内容:
SELECT id,
crew_id,
amount,
CASE type
WHEN @curType THEN @curRow := @curRow + 1
ELSE @curRow := 1
END AS rank,
@curType := type AS type
FROM Table1 p
JOIN (SELECT @curRow := 0, @curType := '') r
ORDER BY crew_id, type
In addition to the answer of @Janty here is a solution if you want to UDATE your table with the rownumber:除了@Janty 的答案之外,如果您想使用行号对表进行 UDATE,这里还有一个解决方案:
UPDATE myTable mt,(SELECT @curRow := 0, @curType := '') r SET type=
(
CASE type
WHEN @curType
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curType := type END
)
;
As janty too crewId is not within.由于 janty 太crewId 不在其中。 Use a second "case" for that as mentioned in the other answers.如其他答案中所述,使用第二个“案例”。
With MySQL 8.0 you can use the window function ROW_NUMBER:在 MySQL 8.0 中,您可以使用窗口函数 ROW_NUMBER:
SELECT *, ROW_NUMBER() OVER(PARTITION BY crew_id) AS row_number
FROM MyTable
SELECT id, crew_id, amount, type,
(
CASE type
WHEN @curType
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curType := type END
) + 1 AS rank
FROM Table1 p,
(SELECT @curRow := 0, @curType := '') r
ORDER BY crew_id, type asc;
Here is my answer using only one case that creates row number according to both columns :这是我仅使用一种根据两列创建行号的情况的答案:
SELECT id, crew_id, amount, type,
(CASE CONCAT(crew_id, type)
WHEN @cur_crew_type
THEN @curRow := @curRow + 1
ELSE @curRow := 0 END) + 1 AS cnt,
@cur_crew_type := CONCAT(crew_id, type) AS cur_crew_type
FROM TABLE t,
(SELECT @curRow := 0, @cur_crew_type := '') counter
ORDER BY crew_id, type;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.