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