Повторяющиеся строки, принадлежащие нескольким группам, перед группировкой - PullRequest
0 голосов
/ 19 марта 2020

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

Однако мои правила не являются взаимоисключающими. Например:

  • Имя начинается с буквы "A"
  • Фамилия начинается с буквы "A"

И некоторые клиенты:

id   first_name    last_name    age  
1    Ava           Adams        36
2    Alexander     Williams     44

Первый клиент соответствует обоим правилам, а второй - только первому правилу.

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

  • 40 для группы 1 (Ава и Александр)
  • 36 для группы 2 (Ава)

Но более того, я действительно хотел бы сгруппировать клиентов, как показано ниже (расчет группы поле, которое можно использовать для агрегации):

Ava            …        Group 1
Ava            …        Group 2 
Alexander      …        Group 2 

Как я могу сделать это с помощью одного SQL запроса?

1 Ответ

2 голосов
/ 19 марта 2020

Рассмотрите возможность использования условного агрегирования:

select
    avg(case when first_name like 'A%' then age end) avg_age_first_name_A
    avg(case when last_name  like 'A%' then age end) avg_age_last_name_A
from mytable
where first_name like 'A%' or last_name like 'A%'

Редактировать : с другой стороны, если вы просто хотите сгенерировать две группы, одна опция - union all:

select t.*, 'group 1' grp from mytable t where first_name like 'A%'
union all select t.*, 'group 2' from mytable t where last_name like 'A%'
...