可以按顺序对排序结果集中的组进行编号吗?

时间:2014-09-18 05:49:52

标签: mysql sql

说我有下表:

id   | sub_id  | Name
----------------------
1    | 7       | Abe
1    | 90      | Bill
1    | 500     | Tom
2    | 1       | Gilbert
3    | 15      | Jose
3    | 18      | Don

我是否可以选择所有结果并根据id按顺序对结果进行编号? AKA,每次检测到新的id时,序列都会从0开始。与SQL Server的RANKDENSE_RANK函数类似。所以结果看起来像这样:

id   | sub_id  | Name     | SequenceNumber
-----------------------------------------
1    | 7       | Abe      |1
1    | 90      | Bill     |2
1    | 500     | Tom      |3
2    | 1       | Gilbert  |1
3    | 15      | Jose     |1
3    | 18      | Don      |2

我可以通过这样的方式生成一个从1开始并在最后一个行号(上例中为6)结束的数字序列:

SELECT @row := @row + 1 as row, t.*
FROM my_table t, (SELECT @row := 0) r

但这不是我真正需要的。建议?

1 个答案:

答案 0 :(得分:1)

你可以使用另一个变量存储以前的id并将其与新id进行比较为此我使用case语句来检查新的id,注意按id排序对于分配正确的序列号很重要

select t.*,
@row:= case when @group = t.id then @row + 1 else 1 end SequenceNumber,
@group:=t.id
from test t
cross join (SELECT @group:=null, @row := 0) r
order by t.id

Demo

如果只有所需的字段,请参阅下面的演示

Demo 2