从Redshift获取数据

时间:2016-03-13 03:25:58

标签: sql amazon-redshift

我试图以某种方式组织数据。这就是我想要做的事情

我在Redshift中有一个表,我们正试图获得以下输出

表:foo

e1 | c1 | c2
1  | 1  | 2
1  | 3  | 4
1  | 5  | 7
1  | 9  | 15
2  | 3  | 4
2  | 7  | 8

我们正试图将前一行c2下一行c1之间的差异小于1的所有行组合在一起

期望输出

e1 | c1 | c2
1  | 1  | 7
1  | 9  | 15
2  | 3  | 4
2  | 7  | 8

当前输出

e1 | c1 | c2
1  | 1  | 4
1  | 3  | 7
2  | 3  | 4
2  | 7  | 8

我尝试过做CTE。这是我正在处理的查询。我得到了孤立的结果,或者

CTE:

Preferences.set("var", val);
String var = Preferences.get("var", defaultValue);

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

我认为你的意思是“我们正试图在前一行c2下一行c1之间的差异小于1 ,其中e1相同”的所有行。

您可以使用Window FunctionsLEAD会给你以下c1(提供的顺序是正确的),然后你可以过滤:

SELECT
  e1,
  c1,
  c2
FROM (
       SELECT
         e1,
         c1,
         c2,
         LEAD(c1, 1)
         OVER (PARTITION BY e1
           ORDER BY e1 ASC, c1 ASC, c2 ASC) AS lead_c1
       FROM so_test
       ORDER BY e1 ASC, c1 ASC, c2 ASC) AS with_lead
WHERE lead_c1 - c2 != 1 OR lead_c1 IS NULL

输出:

e1|c1|c2
1 |5 |7
1 |9 |15
2 |3 |4
2 |7 |8

如果没有表结构的内部知识,我必须按所有列排序,以确保行的顺序与发布的顺序相同。如果你有另一个键(比如排序键),最好使用它。

如果我对其中e1相同的假设是错误的,请删除“PARTITION BY e1”。