Строки Postgres между вызывающими дубликатами - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть простой запрос, который вычисляет сумму значений для текущей строки и 11 предыдущих строк.Он отлично работает, когда число строк больше 12, но если оно меньше 12, данные дублируются для заполнения пропущенных значений.

TOTALS TABLE:

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 голосов
/ 23 сентября 2018

Ключом является select distinct.Это не должно быть необходимым.Если в базовой таблице есть дубликаты, вы должны это исправить.А пока вы можете попытаться скорректировать запрос.

Я не уверен, что это правильное решение.Вот две возможности:

Если дублируются все строки:

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;

Если в таблице итогов есть промежуточные итоги для каждого dy, которые необходимо сложить:

select ID, Report_Month,
       sum(Total) as month_total,
       sum(sum(Total)) over (partition by ID order by report_month rows between 11 preceding and current row) as Running_Total
from TOTALS_TABLE tt
group by id, Report_Month;
0 голосов
/ 23 сентября 2018

Похоже, вам нужен запрос, который суммирует разные идентификаторы, но вы указали сумму для разделения по идентификатору, это означает, что ваш промежуточный итог будет сбрасываться при каждом изменении идентификатора (== вы не можете отправить запросможет выдавать результаты, которые вы опубликовали, даже если Postgres самопроизвольно изобретает ряды, чтобы обеспечить что-то для суммирования).Удалить раздел

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

enter image description here

У меня не было повторяющихся строкпроблема, и я не могу понять, почему добавление аналитики может вызвать это.Я думаю, что у вашей исходной таблицы или запроса действительно есть дублирующиеся строки (я думаю, что вы используете их, чтобы удалить их), и аналитика работает нормально.Сделайте

Select * from totals_table 

И убедитесь, что ваши данные в порядке.Если в нем есть повторяющиеся строки, вы не можете удалить их с помощьюячек, отличных от тех, которые у вас есть, потому что отличные учитывают результат промежуточного итога (и делает каждую строку уникальной).Было бы лучше решить проблему дублирования в источнике, чем пытаться выделить их позже, но если вы настроены на это, вам придется делать свои отличия во внутреннем запросе и промежуточную сумму во внешнем запросе

...