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

Posted

技术标签:

【中文标题】生成行号并将相同的行号分配给相同的值【英文标题】:Generate row numbers and assign same row number to same values 【发布时间】:2019-05-02 11:23:39 【问题描述】:

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

带有AGENT_CODE 列的示例表orders,我希望预期的输出类似于

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

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

【问题讨论】:

你使用的是什么 mysql 版本? 5.2.37 MySQL 服务器 您需要先在派生表中进行显式排序。阅读此答案以了解您得到错误结果的原因:***.com/a/53465139/2469308 【参考方案1】:

你想要类似于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的变量。

【讨论】:

不应该是WHERE x.AGENT_CODE &lt; t.AGENT_CODEWHERE x.AGENT_CODE &lt;= t.AGENT_CODE 不,我忘了给COUNT(*)加1。 嘿@Salman A 这似乎可行,但我将如何从 1 开始,因为你的输出是从 0 开始的。

以上是关于生成行号并将相同的行号分配给相同的值的主要内容,如果未能解决你的问题,请参考以下文章

TSQL在同一列A上放置相同的等级/行号,但一旦A列更改就会增加

sql中的行号-保持相同以更改值

matlab怎么找到一个矩阵中所有相同的两行并返回行号

在表列中查找值并返回表行号 - VBA

给textarea添加行号,textarea使用代码风格的一些思考

Jquery - 分配行号