在 Redshift SQL 中用相同的值标记所有行

Tag all rows with the same values in Redshift SQL

假设我有一个 table 如下:

CREATE TABLE "test_ids" (
   var1 TEXT,
   var2 TEXT,
   var3 TEXT,
   time INT
);

INSERT INTO "test_ids" VALUES
('d1', 'i1', 'f1', 1),
('d2', 'i1', 'f1', 2),
('d2', 'i2', 'f1', 3),
('d1', 'i1', 'f2', 4),
('d3', 'i3', 'f3', 1),
('d3', 'i4', 'f3', 2),
('d3', 'i5', 'f3', 3),
('d3', 'i3', 'f4', 4),
('d4', 'i1', 'f5', 5);

列 var1、var2、var3 之间存在多对多关系,它们的每个组合与首次观察到该组合的时间一起存储在一行中。

但是,用户和变量之间存在一对多关系。也就是说,一个变量(var1var2var3)只能被一个用户观察到。

我想生成一个 table,它将唯一的 user_id 应用于我们计算出的属于一个用户的所有行 - 例如,所有具有:

的行

在此示例中,输出为:

 user | var1 | var2 | var3 | time 
------+------+------+------+------
 u1   | d1   | i1   | f1   |    1
 u1   | d2   | i1   | f1   |    2
 u1   | d2   | i2   | f1   |    3
 u1   | d1   | i1   | f2   |    4
 u2   | d3   | i3   | f3   |    1
 u2   | d3   | i4   | f3   |    2
 u2   | d3   | i5   | f3   |    3
 u2   | d3   | i3   | f4   |    4
 u1   | d4   | i1   | f5   |    5  

不用担心如何使用户 ID 唯一 - 这部分我可以做到。然而,我正在努力解决 ID 的递归连接问题。

假设以下情况是可能的:

d1, i1, f1
d1, i2, f2
d2, i2, f3,
d3, i3, f3

假设您想将所有这些行归因于同一个用户,那么我的回答是您不能。在一些更成熟的数据库中,有一个树查询,但即使是这种类型的查询在这里也不起作用。 如果这只是一个理论问题那么你可以在这里停下来,如果你想要一个实际的答案那么我会 运行 一个带有某种编程语言的算法或者更好(至少在性能方面),实现一个解决方案将此行添加到数据库的操作系统: 每次输入新行时,它会检查其中一个键是否已经属性为用户,如果是,它保留用户标识,如果不是,则分配新的用户标识。