我有2,907,735行和32列的sql数据..我想使用该行中的属性为每一行执行简单的数学计算。
目前,我不得不在R中编程这需要花费很多时间,而且我不确定SQL是否有能力进行这种简单的编程计算。 如果它有能力,我认为SQL会更快。 请帮忙。
q1=0
q2=0
q3=0
q4=0
frac2final=0
sumcnt = 0
cumcnt = 0
year = 0
startpoint1 = 0
startpoint2 = 0
sumexpect = 0
cntatmind = 0
cntatmaxd = 0
exatmind = 0
exatmaxd = 0
ex1=0
ex2=0
ex3=0
ex4=0
cumcntfirst = 0
for (i in 1:2907735)
{
frac2final = a[i,25]
sumcnt = a[i,31]
cumcnt = frac2final + sumcnt
year = a[i,12]
sumexpect = a[i,32]
cntatmind = a[i,4]
cntatmaxd = a[i,5]
exatmind = a[i,6]
exatmaxd = a[i,7]
if(year !=2016) {
startpoint1 = 0
startpoint2=0}
else
{startpoint1 = frac2final
startpoint2 = frac2final}
#cumcntfirst = startpoint2 + cntatmind
if (startpoint1<=0.25) q1 = max( (min(0.25,cumcnt) - startpoint1),0) else q1=0
startpoint1 = startpoint1 + q1
if(startpoint1<=0.5) q2 = max( (min(0.5,cumcnt) - startpoint1),0) else q2=0
startpoint1 = startpoint1 + q2
if(startpoint1<=0.75) q3 = max( (min(0.75,cumcnt) - startpoint1),0) else q3=0
startpoint1 = startpoint1 + q3
q4 = max(0,sumcnt-q1-q2-q3)
a[i,33] = q1
a[i,34] = q2
a[i,35] = q3
a[i,36] = q4
}
答案 0 :(得分:1)
请记住,在SQL中,我们使用集合,而不是循环。一个&#34;中间结果&#34;将是一个中间结果 set ,它与子查询同义(大多数情况下)。
以使用R作为起点的示例:
SELECT q1,
startpoint1 + q1 AS startpoint1
FROM (
startpoint1,
SELECT CASE
WHEN startpoint1 <= 0.25
THEN CASE
WHEN 0 > CASE
WHEN 0.25 > cumcnt
THEN 0.25
ELSE cumcnt
END - startpoint1
THEN 0
ELSE CASE
WHEN 0.25 > cumcnt
THEN 0.25
ELSE cumcnt
END - startpoint1
END
ELSE 0
END AS q1
FROM (
SELECT CASE
WHEN year <> 2016
THEN 0
ELSE frac2final
END AS startpoint1,
CASE
WHEN year <> 2016
THEN 0
ELSE frac2final
END AS startpoint2
FROM yourTable
) subquery1
) subquery2
此处没有复制min
和max
的功能,因此我们必须使用CASE语句来执行逻辑。虽然有很多UDF的例子可以提供这个功能。诀窍是tsql中存在min
和max
DO,但是当将多个记录聚合在一起时,它会获取列中值的最小值/最大值。您在此处的使用与通常称为GREATEST()
和LEAST()
的UDF同义,以比较同一记录中的两个或多个字段。
要掌握它是如何工作的,运行最内层子查询并查看它产生的内容,然后运行下一个子查询(其中包含子查询1)以查看它如何使用这些结果...然后你可以重复使用此逻辑来为最终结果集构建剩余字段。