mysql中每组的行号

use*_*837 31 mysql

我想根据这个可以根据crew_id和类型创建行号的场景生成查询结果.

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我只想在这个输出中使用一个select语句

Jan*_*nty 45

请通过我的小提琴

这最后一次尝试

    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;
Run Code Online (Sandbox Code Playgroud)


Rus*_*iev 17

问题很古老.但我想发布它以防有人会遇到同样的问题.

首先,所描述的答案不正确.例如,对于

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
Run Code Online (Sandbox Code Playgroud)

(我刚刚删除了类型为'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
Run Code Online (Sandbox Code Playgroud)

所以事实上它不使用crew_id和type,它只使用类型.

这是我如何解决这个问题(可能有一个更优雅的方式来做它而不是使用两个嵌套的'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
Run Code Online (Sandbox Code Playgroud)

主要想法仍然存在.我刚刚添加了一个变量@curCrewId.如果有人需要使用3个变量进行分组,那么只需使用3个变量和3个嵌套的'CASE'.:)

  • 如果表中的行不是按 crew_id 和类型排序的,这将不起作用。为了解决这个问题,我添加了一个子查询:`FROM (SELECT * FROM Table1 ORDER BY crew_id, type) p` (2认同)

Old*_*uhy 17

在 MySQL 8.0 中,您可以使用窗口函数 ROW_NUMBER:

SELECT *, ROW_NUMBER() OVER(PARTITION BY crew_id) AS row_number
FROM MyTable
Run Code Online (Sandbox Code Playgroud)