生成行号并将相同的行号分配给相同的值

时间:2018-11-30 10:03:51

标签: mysql sql dense-rank

我需要为每个新出现的重复值显示重复的行号。

具有列orders的示例表AGENT_CODE,我希望期望的输出像

Sl  agent_code
------------------
1   A001
2   A002
2   A002
2   A002
2   A002
2   A002
2   A002
2   A002
3   A003
3   A003
4   A004
4   A004
4   A004
4   A004
5   A007
5   A007
5   A007
6   A008
6   A008

我能够通过编写查询来获得具有类似1,2,3,4 .... 19的序列的行号:

SET @row_number := 0;
SELECT @row_number := @row_number + 1 AS row_number, AGENT_CODE
FROM orders, (SELECT @row_number := 0) t
ORDER BY agent_code

但是我想要的是行号必须按每次出现的顺序打印,如预期输出所示。

1 个答案:

答案 0 :(得分:2)

您想要类似于DENSE_RANK() OVER (ORDER BY AGENT_CODE)的东西,它需要MySQL 8+。在旧版本中,您只需执行以下操作:

SELECT AGENT_CODE, (
    SELECT COUNT(DISTINCT AGENT_CODE) + 1
    FROM orders AS x
    WHERE x.AGENT_CODE < t.AGENT_CODE
) AS sn
FROM orders AS t

PS:如果要使用用户变量,则需要另一个名为@prevagent的变量。