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

oknrviil  于 2023-06-28  发布在  Mysql
关注(0)|答案(2)|浏览(107)

如何使用MySQL创建UPDATE语句来设置唯一的顺序值WITHIN记录簇/组?
我有一个包含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是有效的,因为我不需要聚合--只需要知道状态从前一条记录改变的时间。
任何关于这方面的帮助都将不胜感激。

pkmbmrz7

pkmbmrz71#

您可以使用以下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子句用于按州和人名对记录进行排序。
我希望这对你有帮助!

k97glaaz

k97glaaz2#

非常感谢@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;

相关问题