SQLite -为每个行范围指定一个序号

eyh26e7m  于 2023-02-13  发布在  SQLite
关注(0)|答案(1)|浏览(240)

在我的表中,每种颜色都有索引,它定义了国家内部的颜色顺序,每个国家的顺序可能不同。
| 乡村|颜色|颜色_顺序|其他_数据|
| - ------|- ------|- ------|- ------|
| 加拿大|绿色|1个||
| 加拿大|绿色|1个||
| 加拿大|绿色|1个||
| 加拿大|红色|第二章||
| 加拿大|红色|第二章||
| 加拿大|黄色|三个||
| 加拿大|黄色|三个||
| 法国|红色|1个||
| 法国|蓝色|第二章||
| 法国|蓝色|第二章||
删除一种颜色(所有'red'行)后,我需要为每个国家重新编号color_order。
| 乡村|颜色|颜色_顺序|其他_数据|
| - ------|- ------|- ------|- ------|
| 加拿大|绿色|1个||
| 加拿大|绿色|1个||
| 加拿大|绿色|1个||
| 加拿大|黄色|第二章||
| 加拿大|黄色|第二章||
| 法国|蓝色|1个||
| 法国|蓝色|1个||
它应该是类似嵌套循环的东西,以迭代通过国家/颜色,似乎查询应包括:ROW_NUMBER()OVER(分区按国家排序按颜色排序)
有什么想法吗?

dhxwm5r4

dhxwm5r41#

使用公用表表达式(CTE),首先选择要保留在表中的行(颜色不是“红色”的所有行)。ROW_NUMBER然后使用()函数根据每个国家/地区内color_order列的顺序为每行分配新的color_order最后,使用UPDATE语句将原始表中的color_order值更新为CTE中计算的新值。

WITH cte AS (
  SELECT country, color, color_order, other_data,
         ROW_NUMBER() OVER (PARTITION BY country ORDER BY color_order) AS new_order
  FROM your_table
  WHERE color != 'red'
)
UPDATE cte
SET color_order = new_order;

相关问题