我有一张表已经填充了一些数据。在该表中,我有一个名为package_code的列。此列值不是唯一的。有一些重复的值和一些新的值等。我有另一个列package_id。我需要根据package_code更新package_id值。例如,package_code是001234,那么package_id是1.如果我们有0012行的10行,那么package_id是1.当我们有package_code 004589时,package_id将是2,依此类推。此更新将基于名为sim_id的列进行。以下是我的表数据。
id package_id package_code sim_id
1 001234 40025
2 001234 40025
3 001234 40025
4 001200 40026
5 001240 40027
6 001240 40027
7 001275 40088
8 001275 40088
我想要的输出是:
id package_id package_code sim_id
1 1 001234 40025
2 1 001234 40025
3 1 001234 40025
4 2 001200 40026
5 3 001240 40027
6 3 001240 40027
7 4 001275 40088
8 5 001275 40088
我怎样才能做到这一点?任何帮助将不胜感激。 这是我试图使用的查询。
update line_items set package_id = 1 where package_code HAVING count(*)>1 and sim_id = 40025
答案 0 :(得分:1)
如果您使用的是更通用的数据库,例如SQL Server,我们可以在您的表的CTE中分配一个排名,然后直接更新该CTE。但是你正在使用MySQL,所以问题就变得更难了。
一种方法是从下表中生成package_id
值:
id package_id package_code
1 001234
4 001200
5 001240
7 001275
可以通过package_code
分组然后获取最小id
值来轻松生成此表。感谢上表中的以下查询将生成我们想要的package_id
值:
SELECT package_code,
(SELECT COUNT(*) FROM table t2 WHERE t2.id <= t1.id) package_id
FROM table t1;
我们可以使用此逻辑加入表,然后更新package_id
值:
UPDATE yourTable a
INNER JOIN
(
SELECT
package_code,
(SELECT COUNT(*) FROM (SELECT package_code, MIN(id) AS id
FROM yourTable
GROUP BY package_code) t2
WHERE t2.id <= t1.id) AS rn
FROM
(
SELECT package_code, MIN(id) AS id
FROM yourTable
GROUP BY package_code
) t1
) b
ON a.package_code = b.package_code
SET package_id = b.rn;