重复之间的Postgres行

时间:2018-09-23 05:35:07

标签: sql postgresql window-functions

我有一个简单的查询,用于计算当前行和前11行的值之和。当行数大于12时,它可以很好地工作;但是当行数小于12时,数据将被复制以填充缺失值。

总表:

ID|Report_Month| Total
1 |2018-08-01 |5
2 |2018-09-01 |25
3 |2018-10-01  |15

示例代码:

select distinct 
         ID,
         Report_Month,
         Total,
         sum(Total) over (partition by ID order by report_month rows between 11 preceding and current row) as Running_Total
from TOTALS_TABLE;

预期输出:

ID|Report_Month|Total|Running_Total
1 | 2018-08-01 | 5 | 5
2 | 2018-09-01 | 25 | 30
3 | 2018-10-01 | 15 | 45

实际输出:

1 | 2018-08-01 | 5 | 5
1 | 2018-08-01 | 5 | 10
1 | 2018-08-01 | 5 | 15
1 | 2018-08-01 | 5 | 20
2 | 2018-09-01 | 25 | 45
2 | 2018-09-01 | 25 | 70
2 | 2018-09-01 | 25 | 95
2 | 2018-09-01 | 25 | 120
3 | 2018-10-01 | 15 | 135
3 | 2018-10-01 | 15 | 150
3 | 2018-10-01 | 15 | 165
3 | 2018-10-01 | 15 | 180

任何帮助将不胜感激,我觉得我很可能会错过一些东西。

2 个答案:

答案 0 :(得分:1)

线索是B。这没有必要。如果基础表重复,则应修复该问题。同时,您可以尝试调整查询。

我不确定什么是正确的解决方案。这有两种可能性。

如果整行重复:

select distinct

如果总计表中每个dy的小计都需要加起来:

select ID, Report_Month, Total,
       sum(Total) over (partition by ID order by report_month rows between 11 preceding and current row) as Running_Total
from (select distinct tt.*
      from TOTALS_TABLE tt
     ) tt;

答案 1 :(得分:0)

您似乎想要一个查询,该查询对不同的ID求和,但是您已经告诉总和要对ID进行分区,这意味着每次ID更改时,您的运行总计都会重置(==您无法发布查询可以产生您发布的结果,即使Postgres自发地创建行以提供汇总内容也是如此)。删除分区

https://www.db-fiddle.com/#&togetherjs=fw7TIVul3H

enter image description here

我没有遇到重复行的问题,也看不到为什么添加分析会导致它。我认为您的源表或查询确实有重复的行(我认为您对distinct的使用试图将其删除),并且分析工作正常。做一个

Select * from totals_table 

并检查您的数据是否正常。如果它有重复的行,则不能以与众不同的方式删除它们,因为distinct考虑了运行总计的结果(并使每行都是唯一的)。最好从源头上解决重复问题,而不是稍后再尝试将它们区别开来,但是如果您打算这样做,则必须在内部查询中进行区分,而在外部查询中进行累计