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

时间:2015-07-28 14:03:21

标签: sql amazon-redshift

我们说我有一张表如下:

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
  • var2一起观察到的任何var3d1
  • var3
  • 不同的var2中的任何var1一起被观察到的任何var2
  • var3
  • 不同的var1中的任何var1一起被观察到的任何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 s
  • 中的任何一个一起被观察到的任何其他$(document).ready(function(){ $('select').change(function() { var opt = $(this)[0].options[$(this)[0].selectedIndex]; $(this)[0].style.backgroundColor = opt.style.backgroundColor; $(this)[0].className = opt.className; }); });

在此示例中,输出为:

{{1}}

不要担心如何使用户ID独一无二 - 我可以做到这一点。但是,我正在努力解决ID的递归连接问题。

1 个答案:

答案 0 :(得分:1)

假设以下情况可能:

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

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