Использование Distinct в запросе Aggregate Select - PullRequest
0 голосов
/ 29 октября 2018

Я использую оракул БД. У меня есть Агрегированный скрипт. Мы обнаружили, что некоторые строки в таблице повторяются, являются нежелательными и, следовательно, не должны добавляться в сумму.

теперь предположим, что я использую команду Distinct сразу после оператора select, будет ли отдельная команда применена перед агрегацией или после нее.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

когда вы говорите, что у вас есть повторяющиеся строки - вы должны иметь четкое представление об уникальности для комбинации некоторых конкретных столбцов.

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

select <your group by columns> 
from <your table name> 
group by <your group by predicate>
having (max(A)!=min(A) or max(B)!=min(B) or max(C)!=min(C))

Тогда вы должны решить, что делать с проблемой. Я бы предложил очистить и добавить в таблицу уникальные ограничения.

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

Было бы что-то вроде этого

select <your aggregate functions, counts, sums, averages and so on> 
from <your table name> 
group by <your group by predicate>
having (max(A)=min(A) and max(B)=min(B) and max(C)=min(C)) 

Если вы должны включить группы, нарушающие ожидания уникальности, вы должны каким-то образом сделать квалифицированный выбор того, какой из вариантов в группе использовать - вы можете, например, перейти к последнему или первому, если должен произойти один из ваших столбцов. выразить что-то о том, когда строка была создана.

0 голосов
/ 29 октября 2018

Если вы используете SELECT DISTINCT, то в наборе результатов не будет повторяющихся строк.

Если вы используете SELECT COUNT(DISTINCT), то при подсчете будут учитываться только разные значения.

Если вы думаете об использовании SUM(DISTINCT) (или DISTINCT с любой другой функцией агрегирования), будьте осторожны. Я никогда не использовал его (за исключением, возможно, в качестве демонстрации), и я написал довольно много запросов.

Вам действительно нужно решить проблему у источника. Например, если учетные записи повторяются, то SUM(DISTINCT) не различает учетные записи, а только по значениям, назначенным учетной записи. Вы должны правильно понять логику.

...