在多个条件下插入/联接表



我有一个如下所示的表:

Table A
Version,id
5060586,22285
5074515,22701
5074515,22285
7242751,22701
7242751,22285

我想生成一个名为groupId的新密钥,该密钥作为我的示例插入如下:

Table A
Version,id,groupId
5060586,22285,1
5074515,22701,2
5074515,22285,2
7242751,22701,2
7242751,22285,2

我希望groupId是相同的,只要不同版本中的id是相同的。因此,例如版本5074515和7242751具有相同的id,因此groupId将是相同的。如果所有的id都不相同,那么应该添加一个新的groupId,就像在版本5060586中一样。

如何在SQL oracle中解决这个特定问题?

一种方法是创建一个唯一值,表示每个版本中的id集,然后为的唯一值分配一个groupid,然后连接回原始数据。

INSERT ALL 
INTO t (version,id) VALUES (5060586,22285)
INTO t (version,id) VALUES (5074515,22701)
INTO t (version,id) VALUES (5074515,22285)
INTO t (version,id) VALUES (7242751,22701)
INTO t (version,id) VALUES (7242751,22285)
SELECT 1 FROM dual;
WITH groups
AS
(
SELECT version
, LISTAGG(id,',') WITHIN GROUP (ORDER BY id) AS group_text
FROM t
GROUP BY version
),
groupids
AS
(
SELECT group_text, ROW_NUMBER() OVER (ORDER BY group_text) AS groupid
FROM groups
GROUP BY group_text
)
SELECT t.*, groupids.groupid
FROM t
INNER JOIN groups ON t.version = groups.version
INNER JOIN groupids ON groups.group_text = groupids.group_text;

dbfiddle.uk

您可以使用:

UPDATE tableA t
SET group_id = ( SELECT COUNT(DISTINCT id)
FROM   TableA x
WHERE  x.Version <= t.version );

对于样本数据:

CREATE TABLE TableA (
Version  NUMBER,
id       NUMBER,
group_id NUMBER
);
INSERT INTO TableA (Version, id)
SELECT 5060586,22285 FROM DUAL UNION ALL
SELECT 5074515,22701 FROM DUAL UNION ALL
SELECT 5074515,22285 FROM DUAL UNION ALL
SELECT 7242751,22701 FROM DUAL UNION ALL
SELECT 7242751,22285 FROM DUAL;

然后,更新后:

SELECT * FROM tablea;

输出:

<1>5074515
VERSION
506058622285
507451572427517242751

最新更新