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

Posted

技术标签:

【中文标题】在 Redshift SQL 中标记具有相同值的所有行【英文标题】:Tag all rows with the same values in Redshift SQL 【发布时间】:2015-07-28 14:03:20 【问题描述】:

假设我有一张如下表:

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)只能被一个用户观察到。

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

d1 任何与d1 一起观察到的var2var3 任何var3 与任何var2s 一起被观察到,但var1 不同 任何var2 与任何var3s 一起被观察到,但var1 不同 与var2s 或var3s 中的任何一个一起观察到的任何其他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 的递归连接问题。

【问题讨论】:

您是否尝试过使用row_number() 函数? 谢谢你,@vkp - 是的。这可以解决第一个要点。然而,当我试图理清所有变量之间的多对多关系时,我被束缚住了。如果您有使用ROW_NUMBER() 解决该问题的代码示例,我很乐意看到! 据我所知,row_number() 函数是不可能的 @Serenthia 我不明白用户字段的来源。您怎么知道 u1 与 d1、i1、f1 相关?它在另一张桌子上吗?让我们将“手动”示例更清晰,然后也许我们可以找到解决方案。 @Gluz 我将只使用最终集合中的任何 var1 - 一个 var1 不可能出现在多个集合中,因此这将是一个唯一标识符。这不是我的问题——我还没有找到一种方法来对为一个用户显示的所有 var1s/var2s/var3s 进行分组,以便用相同的用户 ID 标记它们——即。认识到第 1、2、3、4 和 9 行都是一个用户,而第 5、6、7、8 行是另一个用户 【参考方案1】:

假设以下情况是可能的:

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

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

【讨论】:

感谢您抽出宝贵的时间来写这篇文章。我认为你是对的,所以实际上最终用 Scala 编写了这个:)

以上是关于在 Redshift SQL 中标记具有相同值的所有行的主要内容,如果未能解决你的问题,请参考以下文章

仅在某些条件下使用 Redshift 中的 SQL 对具有相同名称的行进行分组

如何在 jdbcTemplate 中为具有相同值的多个参数标记传递参数?

使用java在sql中查找具有相同数据的具有相同值的行?

Redshift:分析数据库中所有表中具有空值的所有列

将具有多个值的 JSON 从 S3 复制到 Redshift

如何知道 Redshift 查询返回的值的类型?