Удаление дубликатов в Cognos 10 на основе столбца / поля без дублирования
В приведенном ниже отчете указаны идентификатор, имя, первичное имя (независимо от того, является ли пользователь основным пользователем или нет (Y или N) и дата, к которой присоединился пользователь. Мне не нужны дубликаты идентификаторов в отчете, и я хочу основать условие удалить дубликаты в основном столбце. Если имя является основным, я хочу сохранить строку. Если это не основной файл, я хочу удалить его только при наличии основного.
ID Name Primary Date
1, Jerry, Y, 2/10/12
1, Jack, N, 2/10/12
1, Jerry, N, 2/10/12
2, Nancy, Y, 1/18/17
2, Chris, N, 3/4/15
3, Vicky, N, 10/2/16
3, Mary, Y, 2/2/10
4, Jeff, N, 1/1/11
4, John, N, 2/2/12
Желаемый вывод
ID Name Primary Date
1, Jerry, Y, 2/10/12
2, Nancy, Y, 1/18/17
3, Mary, Y, 2/2/10
4, Jeff, N, 2/2/12
В основном я хочу показать одну строку для каждого идентификатора, но он должен отображать основной, если таковой имеется. Если нет, то он должен отображать не основной. Если есть несколько первичных, которые показывают только один, не имеет значения, какой, и если есть несколько неосновных (если нет никаких первичных), отображается только один, и не имеет значения, какой.
Если бы условие было основано на дате, я мог бы использовать мин или макс, но это другое.
2 ответа
Вы можете создать дополнительный ранг столбца, упорядоченный по primary DESC
(Y
потом будет выше) и дата. Если у вас есть два с Y
или же N
ранг 1 будет с более новой датой. Затем вы можете добавить фильтр к запросу, чтобы фильтровать только столбцы с rank=1
,
Определение выражения для дополнительного столбца:
rank( [Query2].[PRIMARY] DESC,[Query2].[DATE_ID] for [Query2].[ID])
Добавьте элемент данных с именем Row Count со следующим выражением:
running-count(1 for [ID],[Primary])
Установите для Агрегатного свойства элемента данных значение Вычислено. Мы будем использовать этот элемент данных как средство разрешения конфликтов.
Теперь добавьте этот фильтр:
[Primary] = maximum([Primary] for [ID])
and
[Row Count] = minimum([Row Count] for [ID],[Primary])
Это покажет только одну строку Y, если есть строки Y, и отступит к одной строке N, если строк Y нет. Когда первое условие приводит к нескольким строкам, второе условие выбирает первое. Так как вы указали, что вам не важно, какая строка была выбрана, если их было больше одной, мы могли бы так же легко выбрать последнюю строку, изменив функцию Minimum() во второй части фильтра на Maximum().
Примечание. Функция агрегирования Maximum() при применении к одному символу использует числовое представление ASCII символа для сравнения. Значение ASCII для N равно 78, а значение для Y равно 89. Таким образом, Y всегда будет максимальным, когда существуют значения как Y, так и N. Конечно, когда существуют только N значений, N становится максимальным.