T-SQL变量编程,如R / C ++

时间:2018-02-13 15:28:40

标签: sql sql-server r tsql

我有2,907,7​​35行和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 



}

1 个答案:

答案 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

此处没有复制minmax的功能,因此我们必须使用CASE语句来执行逻辑。虽然有很多UDF的例子可以提供这个功能。诀窍是tsql中存在minmax DO,但是当将多个记录聚合在一起时,它会获取列中值的最小值/最大值。您在此处的使用与通常称为GREATEST()LEAST()的UDF同义,以比较同一记录中的两个或多个字段。

要掌握它是如何工作的,运行最内层子查询并查看它产生的内容,然后运行下一个子查询(其中包含子查询1)以查看它如何使用这些结果...然后你可以重复使用此逻辑来为最终结果集构建剩余字段。