我试图以某种方式组织数据。这就是我想要做的事情
我在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);
有人可以帮帮我吗?
答案 0 :(得分:2)
我认为你的意思是“我们正试图在前一行c2下一行c1之间的差异小于1 ,其中e1相同”的所有行。
您可以使用Window Functions。 LEAD会给你以下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”。