我有一个表格,格式如下:
CREATE TABLE my_data
(
category TEXT,
projectName TEXT,
fileName TEXT,
fileLine TEXT,
fdate DATETIME,
-- other columns...
groupid NUMBER
);
目前,groupid
在所有行中都为空。
我只需要按一些列分组,并为每个组添加一个自动递增的ID。这些列是projectName
、fileName
和fileLine
。
这意味着,组中的所有行(即这三列上具有相同值的行)都应该使用相同的ID进行更新。查询应该分配自动递增的ID(这意味着现在没有值)。
我怎样才能做到这一点呢?
我在这里看到了类似的Auto-increment with Group BY,但它不起作用,因为我的数据库是SQLite,显然一些保留字在那里不起作用。
我考虑执行一个嵌套查询,比如UPDATE-SET-FROM
,其中在From上有一个嵌套的group by
,但我不知道如何处理每个组自动递增的ID分配。
2条答案
按热度按时间flvlnr441#
您可以按如下方式使用
DENSE_RANK
函数:查看db<>fiddle的演示。
我认为您不需要存储此值,因为您只需使用SELECT语句即可获得它:
pn9klfpd2#
不要这样做。
这样的表会违反数据库规范化,因为您的实际组(项目名称+文件名+文件行)可能与组ID不同步。请改为创建组表:
然后填写原始表格中的以下表格:
如果需要复制更多列,则有两个选项:
**选项1:**继续使用
DISTINCT
。如果由于UNIQUE约束,这些列值对于组来说不是唯一的,那么这将失败,并因此将您指向原始表中的数据不一致。**选项#2:**告诉DBMS选择哪些值(通常是一个组的最小值、最大值或总和):
现在您已经做到了这一点,您的表已经相关,并且您已经为每个组分配了一个组ID。如果您希望保留这些按业务键相关的表(项目名称+文件名+文件行),请在其上创建外键:
你就完了。
如果您不想这样做,而是通过组ID关联表,请将其添加到您的表中:
然后填上:
然后删除多余的列:
然后添加外键: