我正在抬头"跑步总数"对于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
吗?
答案 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 |
无论如何(在不存在关系的情况下,哪一行首先出现是不确定的)