Агрегировать значения в столбцах ТОЛЬКО там, где есть разница в значениях, я не хочу агрегировать все значения обязательно - PullRequest
0 голосов
/ 05 ноября 2019

Если значения одного столбца совпадают, я хочу: 1. Агрегировать данные в других столбцах ТОЛЬКО там, где между двумя значениями есть различия. 2. Если значения одинаковы, принять значение

* 1002. * Пример данных
Name  MiddleName Surname Age 
Ryan   David     Smith   28
Ryan   David     Smith   29
Sean   John       Johnson 37
Sean   John       Johnson 38

Желаемый результат:

Name  MiddleName Surname Age
Ryan    David    Smith   28, 29
Sean    John     Johnson 37, 38

Имя ryan появляется дважды, поэтому необходимо агрегировать данные для других полей фамилия и возраст ТОЛЬКО там, где данные отличаются длядве строки.

Фамилия Смит в обеих строках, поэтому не нужно агрегировать, просто хотите заполнить как Смит в одном ряду.

Возраст отличается, поэтому хотите агрегировать возраст для двух строкв одну строку

запись Шона Джонсона, я хочу объединить возрасты, поскольку они различны, но не отчество, так как это одинаково для обеих записей

select name, string_agg(distinct middlename, ','), string_agg(distinct surname, ',') as surname, string_agg(age, ',')
from t
group by name;

результат, который не является чемжелательно:

Name    MiddleName Surname Age
Ryan    David      Smith   28, 29
Sean    John, John Johnson 37, 38

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

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

with middlenames as (
  select distinct name, middlename
  from t
),
surnames as (
  select distinct name, surname
  from t
)
ages as (
  select distinct name, age
  from t
)
select distinct name,
       (select string_agg(middlename, ',') from middlenames m where m.name = t.name) as middlenames,
       (select string_agg(surname, ',') from surnames s where s.name = t.name) as surnames,
       (select string_agg(age, ',') from ages a where a.name = t.name) as ages
from t

Было бы намного проще, если бы SQL Server поддерживал string_agg (DISTINCT middlename, ',') , но AFAIK мы не знаем, когда он будет доступен, поэтому нам нужно сначала вычислить отдельные значения отдельно.

Я не знаю, есть ли более простой способ получить те же результаты, но этот должен получить тот результат, о котором вы просили.

1 голос
/ 05 ноября 2019

Сгруппируйте по всем значениям, которые вы хотите, чтобы они были одинаковыми:

SELECT name, middlename, surname, string_agg(age, ',')
FROM t
GROUP BY name, middlename, surname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...