mysql - MySQL - 为分组生成序列号
问题描述
我得到了一个用于填充 MySQL 数据库的源文件。我使用 Python 脚本来清理和转换数据。我试图解决的问题的一个小例子如下所示。
源文件
Area | Team |
---------------------------------------
NORTH EAST - CO.DURHAM BL | Winters |
NORTH EAST - NEWCASTLE GT | Summers |
...... |
SOUTH EAST - SOUTHAMPTON BI | Winters |
阶段 2 在清理等之后转换为 DB 临时表。
ID | Region | City | State | Team |
----------------------------------------------------|
1 | NORTH EAST | DURHAM | BL | Winters |
2 | NORTH EAST | NEWCASTLE | GT | Summers |
......
80 | SOUTH EAST | SOUTHAMPTON | BI | Winters |
第 3 阶段 - 为每个区域分组生成区域 ID
ID | Region ID | Region | City | State | Team |
-------------------------------------------|-----------|---------|
1 | 1 | NORTH EAST | DURHAM | BL | Winters |
2 | 1 | NORTH EAST | NEWCASTLE | GT | Summers |
......
80 | 10 | SOUTH EAST | SOUTHAMPTON | BI | Winters |
是否可以为mysql中的分组生成序列号?例如,在上面的场景中,是否可以生成RegionID
列使得 NORTH EAST 区域分组为 1,SOUTH EAST 分组为 10 等等。这将如何实现?
注意有没有办法自动生成序列?例如,区域 id 列中的值是否可以自动生成而无需在区域表中手动指定 id?
解决方案
CREATE TABLE regions (
region_id INT PRIMARY KEY
region varchar(10),
key(region)
);
INSERT INTO regions VALUES
(1, 'NORTH EAST'), (10,'SOUTH EAST'), etc...
UPDATE db_staging_table AS d
JOIN regions AS r USING (region)
SET d.region_id = r.region_id;
如果您使用的是 MySQL 8.0,您可以这样做:
WITH cte (region, region_id) AS (
SELECT region, ROW_NUMBER() OVER()
FROM db_staging_table
GROUP BY region
)
UPDATE db_staging_table AS d JOIN cte ON d.region = cte.region
SET d.region_id = cte.region_id;
推荐阅读
- vba - SAP 列 ID 到数组
- python - 无法解码嗅探的输出
- tsql - SQL Server 中每一行的插入触发器之前的 Oracle 等效项
- javascript - 通过自动缩放到展开的节点来管理大型分层数据(可折叠树)
- mysql - 将一个表中的列值替换到另一个表中而不添加另一列
- php - Laravel 8 验证器因 POST API 上的嵌套 JSON 请求而失败
- kotlin - 将 List 转换为 MutableList Kotlin 会出错
- python - 在 AWS Lambda 函数中使用 python 运行 ffmpeg 命令的问题
- unity3d - 在 VR 中单击 inputField 时打开键盘(Oculus Quest 2 和 XRIT)
- bluespec - 关于附带条件的澄清