我有一个简单的查询,用于计算当前行和前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
任何帮助将不胜感激,我觉得我很可能会错过一些东西。
答案 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
我没有遇到重复行的问题,也看不到为什么添加分析会导致它。我认为您的源表或查询确实有重复的行(我认为您对distinct的使用试图将其删除),并且分析工作正常。做一个
Select * from totals_table
并检查您的数据是否正常。如果它有重复的行,则不能以与众不同的方式删除它们,因为distinct考虑了运行总计的结果(并使每行都是唯一的)。最好从源头上解决重复问题,而不是稍后再尝试将它们区别开来,但是如果您打算这样做,则必须在内部查询中进行区分,而在外部查询中进行累计>