SQL Server运行总计(按顺序总和)

时间:2014-10-13 13:25:52

标签: sql-server sum

我正在抬头"跑步总数"对于SQL Server。轻松查询。所以我写了这个:

SELECT 
    firstname, lastname, thetot, 
    SUM(thetot) OVER (ORDER BY lastname) AS runningtot 
FROM 
    customers

您认为准确的运行总量将是输出。不一定是真的。这是它吐出来的东西:

firstname   lastname    thetot  runningtot

Billy       BobThornton 0.01    4.46
Billy       BobThornton 4.45    4.46
Bob         Hope        3.52    7.98
Jimmy       Johnson     4.84    12.82
Jason       Meyers      3.50    16.32
Ted         Turner      1.77    18.09

只是我或第一张唱片应该成为0.01吗?

1 个答案:

答案 0 :(得分:0)

您提供的自我答案会彻底改变语义。

在您按照名字排序计算运行总计的问题中,通过PK任意切换到顺序会返回一个回答完全不同问题的结果集。

您看到的结果集的原因记录在in books online

  

如果未指定ROWS / RANGE但指定了ORDER BY,则RANGE   UNBOUNDED PRECEDING和CURRENT ROW用作窗口的默认值   帧。

RANGE的语义是与相同ORDER BY值绑定的值将始终包含在彼此的窗口框架中。

与原始语义兼容的一种方法是在ORDER BY添加一个确定唯一性的平局 - 从而永远不会发生关系。

SELECT firstname,
       lastname,
       thetot,
       SUM(thetot) OVER (ORDER BY lastname, pk) AS runningtot
FROM   customers 

然而,这不是表现最佳的方法。

Aaron Bertrand's running total comparison中所述,RANGE的实施效果不如ROWS

此外,ROWS的行为与您期望的一样。

SELECT firstname,
       lastname,
       thetot,
       SUM(thetot) OVER (ORDER BY lastname ROWS UNBOUNDED PRECEDING) AS runningtot
FROM   customers 

会返回

| firstname |    lastname | thetot | runningtot |
|-----------|-------------|--------|------------|
|     Billy | BobThornton |   0.01 |       0.01 |
|     Billy | BobThornton |   4.45 |       4.46 |
|       Bob |        Hope |   3.52 |       7.98 |
|     Jimmy |     Johnson |   4.84 |      12.82 |
|     Jason |      Meyers |    3.5 |      16.32 |
|       Ted |      Turner |   1.77 |      18.09 |

或者可能

| firstname |    lastname | thetot | runningtot |
|-----------|-------------|--------|------------|
|     Billy | BobThornton |   4.45 |       4.45 |
|     Billy | BobThornton |   0.01 |       4.46 |
|       Bob |        Hope |   3.52 |       7.98 |
|     Jimmy |     Johnson |   4.84 |      12.82 |
|     Jason |      Meyers |    3.5 |      16.32 |
|       Ted |      Turner |   1.77 |      18.09 |

无论如何(在不存在关系的情况下,哪一行首先出现是不确定的)

相关问题