1

当我执行以下 SQL 查询时:

select yr,
       mn, 
       "%ind", 
       sum("%ind") OVER (order BY yr,mn) as "Sum%" 
from table2 
order by yr, mn; 

结果是:

  yr  | mn |        %ind        |       Sum%       
------+----+--------------------+------------------
 1996 |  2 |   18.1818181818182 | 18.1818181818182
 1996 |  2 |   9.09090909090909 | 81.8181818181818
 1996 |  2 |   9.09090909090909 | 90.9090909090909
 1996 |  2 |   9.09090909090909 |              100
 1996 |  3 |   12.1951219512195 |  112.19512195122
 1996 |  3 |   31.0975609756098 | 143.292682926829
 1996 |  3 |  0.609756097560976 | 199.390243902439
 1996 |  3 |  0.609756097560976 |              200
 1996 |  4 |    4.8780487804878 | 204.878048780488
 1996 |  4 |    24.390243902439 |  268.29268292683
 1996 |  4 |   14.6341463414634 | 298.780487804878
 1996 |  4 |   1.21951219512195 |              300

这是一个问题,因为我想要做的是添加给定月份的 %ind 对应列的每一行,例如 1996-3。此外,一旦月份发生变化,我希望它重新从 0 添加到 100%。因此,理想的表将是:

  yr  | mn |        %ind        |       Sum%       
------+----+--------------------+------------------
 1996 |  2 |   18.1818181818182 | 18.1818181818182
 1996 |  2 |   9.09090909090909 | 81.8181818181818
 1996 |  2 |   9.09090909090909 | 90.9090909090909
 1996 |  2 |   9.09090909090909 |              100
 1996 |  3 |   12.1951219512195 |   12.19512195122
 1996 |  3 |   14.0243902439024 |   86.585365853659
 1996 |  3 |  0.609756097560976 |   99.390243902439
 1996 |  3 |  0.609756097560976 |              100
 1996 |  4 |    4.8780487804878 |    4.878048780488
 1996 |  4 |   15.8536585365854 |   84.146341463415
 1996 |  4 |   14.6341463414634 |   98.780487804878
 1996 |  4 |   1.21951219512195 |              100

我的 SQL 查询中缺少什么?

4

1 回答 1

1

您需要添加partition by BY yr,mn到窗口定义。由于您没有定义分区(“组”),因此窗口函数对整个结果集进行操作:

此外,您必须找到另一列来定义一个月的值的稳定排序。假设您有一个由序列生成的 ID 列,这样的事情应该可以工作:

select yr,
       mn, 
       "%ind", 
       sum("%ind") OVER (partition by yr,mn order by id) as "Sum%" 
from table2 
order by yr, mn; 

这是一个 SQLFiddle 示例:http ://sqlfiddle.com/#!12/33838/1

于 2013-08-01T13:51:44.223 回答