提问人:Chris 提问时间:6/24/2023 更新时间:6/24/2023 访问量:71
使用MySQL,如何在组内设置唯一序列号
Using MySQL, How to Set Unique Sequence Number WITHIN a Group
问:
如何使用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 有效,因为我不需要聚合 - 只需要知道状态何时从上一条记录更改。
对此的任何帮助将不胜感激。
答:
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;
评论
SELECT VERSION();