在mysql中每个组的行号
我想根据这个场景产生查询结果,根据crew_id和type来创build行号。
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必须是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
我只想在这个输出中使用一个select语句
这个问题是相当古老的。 但我想张贴,以防有人会有同样的问题。
首先,描述的答案不正确。 例如,为
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
(我只是删除行types'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
所以实际上它不使用crew_id和type,它只是使用types。
下面是我如何解决这个问题(可能有一个更优雅的方式来做比使用两个嵌套的'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
主要的想法依然存在。 我刚刚添加了一个variables@curCrewId。 如果有人需要使用3个variables进行分组,那么只需使用3个variables和3个嵌套的CASE。 🙂
请通过我的小提琴
这一个最后尝试
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;
@ Janty的答案不起作用时,types以数字开始(排名从2开始,而不是1)。
请改用以下内容:
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
除了@Janty的答案以外,如果你想用rownumber指定你的表,
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 ) ;
因为太太crewId不在。 如其他答案中提到的那样,使用第二个“案例”。
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;
这里是我的答案只使用一个案例 ,根据两列创build行号:
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;