SUM () OVER (PARTITION BY) AS - когда дубликаты существуют - PullRequest
0 голосов
/ 07 февраля 2020

У меня проблема с использованием SUM () OVER (PARTITION BY), когда у меня есть дубликаты записей. Я могу удалить дубликаты, используя DISTINCT, но SUM по-прежнему выполняется для всех дублирующих записей.

Например, мои данные:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |

При применении DISTINCT становится:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |

Итак, проблема в том, что я надеюсь, что столбец SUM будет равен 50.

Код SUM:

SUM(value) OVER (PARTITION BY ref) AS Total

Я хотел бы видеть:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |50          |
|101    |CODE2  |30     |50          |

Любой совет приветствуется. Спасибо.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Вы можете сначала select distinct в подзапросе, а затем выполнить сумму окна:

select ref, codes, value, sum(value) over(partition by ref) total
from (select distinct ref, codes, value from mytable) t

Это приведет к результирующему набору с 2 записями и total из 50.

0 голосов
/ 07 февраля 2020

Я бы использовал group by:

select ref, codes, value, sum(value) over(partition by ref) total_sum
from test
group by ref, codes, value;

Если это не подходит для вашего сценария, объясните почему. В этом примере имя таблицы называется test. Вот ДЕМО

...