Teradata-计算先前的值

时间:2018-07-02 15:42:22

标签: sql count sum teradata

我试图将查询中的先前值求和,作为完成另一项任务的中间步骤。我想将之前的值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中实现这一目标?

2 个答案:

答案 0 :(得分:0)

您至少可以在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。

答案 1 :(得分:0)

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

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

import Foundation
import XCTest

class MapPerfTests: XCTestCase {
	var array =
		[
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString",
			"MyString"
	]

	func testForLoopAllInOnePerf() {
		measure {
			var newArray: [String] = []
			for item in array {
				newArray.append(item.uppercased().lowercased().uppercased().lowercased())
			}
		}
	}

	func testForLoopMultipleStagesPerf() {
		measure {
			var newArray: [String] = []
			for item in array {
				let t1 = item.uppercased()
				let t2 = item.lowercased()
				let t3 = item.uppercased()
				let t4 = item.lowercased()
				newArray.append(t4)
			}
		}
	}

	func testMultipleMapPerf() {
		measure {
			let newArray = array
				.map( { $0.uppercased() } )
				.map( { $0.lowercased() } )
				.map( { $0.uppercased() } )
				.map( { $0.lowercased() } )
		}
	}

	func testSingleMapPerf() {
		measure {
			let newArray = array
				.map( { $0.uppercased().lowercased().uppercased().lowercased() } )
		}
	}
}

MapPerfTests.defaultTestSuite.run()

select t.*, count(case when value = 3 then 1) over (order by ? rows between unbounded preceding and 1 preceding) from t; 用于指定顺序的列。