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;
?
用于指定排序的列。
我正在尝试对查询中的先前值求和,作为完成另一项任务的中间步骤。我想总结 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;
?
用于指定排序的列。