在 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 之间存在多对多关系,它们的每个组合与首次观察到该组合的时间一起存储在一行中。
但是,用户和变量之间存在一对多关系。也就是说,一个变量(var1
、var2
或 var3
)只能被一个用户观察到。
我想生成一个 table,它将唯一的 user_id 应用于我们计算出的属于一个用户的所有行 - 例如,所有具有:
的行
d1
- 与
d1
一起观察到的任何 var2
或 var3
- 曾经观察到的任何
var3
以及具有不同 var1
的任何 var2
- 曾经观察到的任何
var2
以及具有不同 var1
的任何 var3
- 与任何
var2
或 var3
一起观察到的任何其他 var1
在此示例中,输出为:
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
假设您想将所有这些行归因于同一个用户,那么我的回答是您不能。在一些更成熟的数据库中,有一个树查询,但即使是这种类型的查询在这里也不起作用。
如果这只是一个理论问题那么你可以在这里停下来,如果你想要一个实际的答案那么我会 运行 一个带有某种编程语言的算法或者更好(至少在性能方面),实现一个解决方案将此行添加到数据库的操作系统:
每次输入新行时,它会检查其中一个键是否已经属性为用户,如果是,它保留用户标识,如果不是,则分配新的用户标识。
假设我有一个 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 之间存在多对多关系,它们的每个组合与首次观察到该组合的时间一起存储在一行中。
但是,用户和变量之间存在一对多关系。也就是说,一个变量(var1
、var2
或 var3
)只能被一个用户观察到。
我想生成一个 table,它将唯一的 user_id 应用于我们计算出的属于一个用户的所有行 - 例如,所有具有:
的行d1
- 与
d1
一起观察到的任何 - 曾经观察到的任何
var3
以及具有不同var1
的任何 - 曾经观察到的任何
var2
以及具有不同var1
的任何 - 与任何
var2
或var3
一起观察到的任何其他var1
var2
或 var3
var2
var3
在此示例中,输出为:
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
假设您想将所有这些行归因于同一个用户,那么我的回答是您不能。在一些更成熟的数据库中,有一个树查询,但即使是这种类型的查询在这里也不起作用。 如果这只是一个理论问题那么你可以在这里停下来,如果你想要一个实际的答案那么我会 运行 一个带有某种编程语言的算法或者更好(至少在性能方面),实现一个解决方案将此行添加到数据库的操作系统: 每次输入新行时,它会检查其中一个键是否已经属性为用户,如果是,它保留用户标识,如果不是,则分配新的用户标识。