我想根据这个可以根据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'.:)
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)
| 归档时间: |
|
| 查看次数: |
26883 次 |
| 最近记录: |