使用MySQL,如何在组内设置唯一序列号

Using MySQL, How to Set Unique Sequence Number WITHIN a Group

提问人:Chris 提问时间:6/24/2023 更新时间:6/24/2023 访问量:71

问:

如何使用MySQL创建UPDATE语句,以在集群/记录组中设置唯一的顺序值?

我有一个表,其中包含 UniqueID、State(“AL”、“CA”等)、PersonName 和 StateID 的列。我需要为每个人的 StateID 编号,每个州从 1 开始

这是我的设置:

CREATE TABLE MyData( UniqueID VARCHAR(64), State VARCHAR(64), PersonName VARCHAR(64), StateID INT );
INSERT INTO MyData VALUES ( UUID(), 'CA', 'David', NULL ), ( UUID(), 'CA', 'Ann', NULL ), ( UUID(), 'CA', 'Bob', NULL ),
                          ( UUID(), 'AL', 'Mary', NULL ), ( UUID(), 'AL', 'Tom', NULL ), ( UUID(), 'AL', 'Evelyn', NULL );

我希望 StateID 从 1 开始,并在每个州内为每条记录递增,然后为每个新状态重置为 1。排序不必按字母顺序排列。

预期结果:

someIDvalue AL Mary   1
someIDvalue AL Tom    2
someIDvalue AL Evelyn 3
someIDvalue CA David  1
someIDvalue CA Ann    2
someIDvalue CA Bob    3

到目前为止,我能够做到这一点:

    UPDATE MyData
INNER JOIN (    SELECT UniqueID, (SELECT @RowNumber := @RowNumber +1) NewStateID
                  FROM MyData
            INNER JOIN ( SELECT @RowNumber := 0 ) InternalVariable
              ORDER BY MyData.State ) ReorderedSet ON MyData.UniqueID = ReorderedSet.UniqueID
       SET MyData.StateID = ReorderedSet.NewStateID;

但是,当状态更改时,这不会重置排序。

我不认为使用 GROUP 有效,因为我不需要聚合 - 只需要知道状态何时从上一条记录更改。

对此的任何帮助将不胜感激。

MySQL 分组 顺序

评论

0赞 Bill Karwin 6/24/2023
很抱歉投票提前结束您的问题。我误解了它,并认为您想要自动增量以持续的方式执行此操作。如果您只想更新现有行,我有一个解决方案,它依赖于 MySQL 8.0 中的窗口函数功能。您使用的是 MySQL 8.0 吗?您可以与 进行检查。SELECT VERSION();

答:

0赞 user21027925 6/24/2023 #1

您可以使用以下 MySQL 查询在集群/记录组中设置唯一的顺序值

SET @row_number:=0; SET @state:=''; UPDATE MyData SET StateID = (@row_number:=CASE WHEN @state=State THEN @row_number+1 ELSE 1 END) AND @state:=State ORDER BY State, PersonName;

当状态更改时,此查询将重置排序。@row_number变量用于跟踪序列号,@state变量用于跟踪当前状态。ORDER BY 子句用于按州和人名对记录进行排序。

我希望这会有所帮助!

评论

0赞 The Impaler 6/24/2023
变量在 MySQL 5.x 中有效,但现在在 MySQL 8.x 中已弃用(尽管可以启用它们)。
0赞 Chris 6/24/2023
谢谢:。。。我不得不更改初始 SET @state:=(SELECT State FROM MyData ORDER BY State LIMIT 1);.....而“AND”歪曲了 UPDATE 语句中的逻辑;但是,如果我用逗号替换它(这对我来说似乎更明智),就会出现错误。还有其他建议吗?
1赞 NotTheDr01ds 6/25/2023
欢迎来到 Stack Overflow!过去两天的大部分或全部答案似乎全部或部分是由人工智能(例如 ChatGPT)编写的。请注意,此处禁止发布 AI 生成的内容。如果您使用 AI 工具来协助回答任何问题,我鼓励您将其删除。谢谢!
1赞 NotTheDr01ds 6/25/2023
读者应该仔细和批判性地审查这个答案,因为人工智能生成的信息通常包含根本性的错误和错误信息。如果您发现质量问题和/或有理由相信此答案是由 AI 生成的,请留下相应的反馈。审核团队可以使用您的帮助来识别质量问题。m
0赞 Chris 6/24/2023 #2

非常感谢丹尼尔@Adesegun;这是一个轻微的修改,最终成为一个明确的解决方案。

SET @row_number:=0; 
SET @state:=(SELECT State FROM MyData ORDER BY State LIMIT 1); 
UPDATE MyData SET MyData.StateID = (@row_number:= CASE WHEN @state=State THEN @row_number+1 ELSE 1 END), State = (@state := State) 
ORDER BY State, UniqueID;