Teradata - 计算以前的值

Teradata - Counting previous values

我正在尝试对查询中的先前值求和,作为完成另一项任务的中间步骤。我想总结 3 的先前值, 例如

Type   value
A        3 
A        3
A        3
A        3
A        3
A        3
A        3
B        2.3
B        2.3 
B        3
B        2.3 
B        2.3 
B        3
B        2.3

我的理想答案是

Type   value   Previous 3's
A        3             0
A        3             1 
A        3             2
A        3             3
A        3             4
A        3             5
A        3             6
B        2.3           7
B        2.3           7
B        3             7
B        2.3           8
B        2.3           8
B        3             8
B        2.3           9

我如何在 Teradata 或 SQL 中实现这一点?

你至少可以在 MYSQL:

create table teadata(Type varchar(1), value number);
insert into teadata(Type, value) values('A', 3);
insert into teadata(Type, value) values('A', 3);
insert into teadata(Type, value) values('A', 3);
insert into teadata(Type, value) values('B', 3);
insert into teadata(Type, value) values('B', 2.3);

select type, value, (@sum := @sum + (case when value = 3 then 1 else 0 end)) as cumesum 
    from teadata t cross join (select @sum := 0) params;

这将打印:

+------+-------+---------+
| type | value | cumesum |
+------+-------+---------+
| A    |     3 |       1 |
| A    |     3 |       2 |
| A    |     3 |       3 |
| B    |     3 |       4 |
| B    |   2.3 |       4 |
+------+-------+---------+

本例中的技巧是将变量@sum 与case 语句一起使用。这适用于 MySQL。不确定 Teradata。

SQL 表表示 无序 集合。要计算以前的值,您需要一个指定顺序的列,而您的问题中没有。

您可以使用累计计数或总和:

select t.*,
       count(case when value = 3 then 1) over
           (order by ? rows between unbounded preceding and 1 preceding)
from t;

? 用于指定排序的列。