【发布时间】:2020-10-12 14:02:53
【问题描述】:
假设我有一张表t,如下所示:
b a v
4 1 1
3 3 2
3 2 3
3 4 4
如何使用带有条件OVER() 子句的分析函数?在下面的示例中,我选择了v 的累积总和。但是,我希望每行累积 v 的前面值,前提是 b(对于正在考虑求和的每一行)大于“当前”行的 a。
SELECT SUM(v)
OVER(ORDER BY v ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) c
FROM t
应用逻辑会给我以下结果:
c
1
1
6
0
所以我的问题是:是否可以将此逻辑合并到OVER() 子句的定义中?还是我应该考虑另一种方法?
更新
由于这个问题似乎被许多人误解,我将尝试澄清一下。这里重要的是基于比较累积。比较的是 current 行(正在为其计算累积总和的行)中的 a 的值和 b 的值,对于正在“考虑”的每一行累积(前行和当前行)。
我提供的示例恰好具有适合以下if ... then sum else 0-type 解决方案的格式。我也更新了这个例子,希望能给这个问题带来更多的启发。
【问题讨论】:
-
"如果
b(对于被考虑求和的每一行)大于“当前”行的a” - 为什么1,1,6,0? 3 不大于 3,我想应该是1,0,6,0。 -
你对,我的错。
1, 0, 6, 0是正确的输出。我已经更新了问题。 -
一般提供所有
v > 0的条件下不能存在两个或多个相邻相等值的输出。下一个值要么大于前一个,要么为零。 -
我不确定我是否遵循。如果第一行中
b的值是4而不是3,会发生什么?此解决方案仍将产生1, 0, 6, 0。与条件下的累计和不同。
标签: sql google-cloud-platform google-bigquery sum window-functions