Как удалить повторяющиеся значения из совокупного списка при использовании LISTAGG() в Oracle SQL?

Я создал таблицу:

Grade FName LName-

A     JOHN     M

A     JOE      M

A     JOAKIM   M

Используется Listagg() для получения конкатенированной агрегации Fname и Lname с помощью запроса:

SELECT GRADE,listagg(st_name || ';' || st_last_name, ';')
        within group ( order by st_name) as names FROM STUDENTS GROUP BY GRADE;

Результат, который я получаю:

GRADE    Name

A     JOAKIM;M;JOE;M;JOHN;M

B        BROAD;M

C        KEVIN;M;SEEHO;M

Я хочу сохранить только одну букву «М» в столбце имени и отказаться от других букв «М». Пожалуйста, предоставьте мне какие-либо предложения о том, как это сделать. Пожалуйста, не конкретизируйте этот вопрос. Спасибо!

Пример: KEVIN;M;SEEHO;M должен быть KEVIN;M;SEEHO, JOAKIM;M;JOE;M;JOHN;M должен быть JOAKIM;M;JOE;JOHN и так далее...


person Shaan Anshu    schedule 20.06.2018    source источник


Ответы (1)


Для простого запроса вы можете использовать подзапрос:

SELECT GRADE, listagg(name, ';') within group (order by name) as names
FROM (SELECT DISTINCT GRADE, st_name || ';' || st_last_name as name
      FROM STUDENTS
     ) s
GROUP BY GRADE;

Мне кажется странным, что вы используете точку с запятой как для разделения st_name и st_last_name, так и для разделения разных значений. Я ожидаю, что будут использоваться разные разделители - 'john;smith;jane;doe;' труднее читать, чем 'john,smith;jane,doe'.

person Gordon Linoff    schedule 20.06.2018
comment
У меня есть требование, которое требует, чтобы M был один раз, и этот список задается в объекте DTO. Можем ли мы сделать это без подзапроса? - person Shaan Anshu; 21.06.2018
comment
Как насчет редактирования вопроса (кнопка изменить находится прямо под тегами вопроса) и включения некоторых тестовых данных? Спасибо. - person Bob Jarvis - Reinstate Monica; 21.06.2018
comment
Я добавил данные. Не могли бы вы помочь сейчас? - person Shaan Anshu; 21.06.2018