Как избежать дублирования значений в столбце в sql - PullRequest
1 голос
/ 25 мая 2020

Я использую приведенный ниже код для извлечения данных из двух таблиц. Но я вижу несколько повторяющихся значений в столбцах data1 и data2.


SELECT DISTINCT a.student_id,a.class,a.sub_id,
      stringagg(a.sub_num) OVER (PARTITION BY a.student_id, a.class, a.sub_id 
                           ORDER BY NLSSORT(a.sub_num, 'NLS_SORT=BINARY_CI') ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
                          ) AS data1,
      stringagg(b.date) OVER (PARTITION BY b.sub_id 
                        ORDER BY NLSSORT(b.date, 'NLS_SORT=BINARY_CI') ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
                          ) AS data2
from tsg_class a JOIN tsg_date b ON a.student_id = b.student_id
                                and a.class = b.class
                                and a.sub_id = b.sub_id
where a.student_id = 38147;

Мой результат выглядит как на прикрепленном изображении:

enter image description here

Data1 и Data2 имеют повторяющиеся значения, такие как 22**** 22**** 22**** 22**** 555555 555555 555555 555555 и 001 001 7WW 7WW D04 D04 MS7 MS7

Но я хотел, чтобы это было как 22**** 55555 и 001 7ww D04 MS7.

Пожалуйста, предложите.

1 Ответ

0 голосов
/ 25 мая 2020

Какую базу данных вы используете? PL / SQL предлагает Oracle, но здесь нет функции stringagg - сейчас мы используем listagg. Последняя версия Oracle поддерживает listagg(distinct ...), что решает вашу проблему.

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


Это то, что у вас есть сейчас:

SQL> select listagg(job, ',') within group (order by job) jobs from emp;

JOBS
--------------------------------------------------------------------------------
ANALYST,ANALYST,CLERK,CLERK,CLERK,CLERK,MANAGER,MANAGER,MANAGER,PRESIDENT,SALESM
AN,SALESMAN,SALESMAN,SALESMAN

Это то, что вы хотите, но ваша версия Oracle базы данных не поддерживает его:

SQL> select listagg(distinct job, ',') within group (order by job) jobs from emp;
select listagg(distinct job, ',') within group (order by job) jobs from emp
       *
ERROR at line 1:
ORA-30482: DISTINCT option not allowed for this function

Вот что вам следует сделать:

SQL> select listagg(job, ',') within group (order by job) jobs
  2  from (select distinct job from emp);

JOBS
--------------------------------------------------------------------------------
ANALYST,CLERK,MANAGER,PRESIDENT,SALESMAN

SQL>
...