SQL.Проверка состояния и маркировка в колонне - PullRequest
0 голосов
/ 17 июня 2019

Вот моя таблица PEOPLE, где я храню имя, фамилию, DOB (дату рождения) и некоторые другие данные. В новом запросе мне нужно добавить дополнительный столбец с условием для людей с одинаковой комбинацией имени и фамилии. Вот условие:

  • Просмотрите каждую группу людей с одинаковыми комбинациями имени и фамилии, в дополнительном поле отметьте тех, чей DOB не максимальный и не минимальный (по сравнению только с одним и тем же именем и фамилией)
  • Если есть только 1 или 2 вхождения с одинаковыми именем и фамилией, отметьте их в любом случае

enter image description here

Вот результат запроса

enter image description here

Пояснение:

  • Джон Доу помечен как встреченный только один раз
  • Том Тейлор помечен как встреченный только дважды
  • Алиса Смит и Боб Браун отмечены везде, кроме записей с минимальным и максимальным DOB

Помогите, пожалуйста, сформировать SQL-запрос для желаемого результата. Вот мое понимание (догадка)

  • Получить список уникальных пар Имя и Фамилия, (где вхождения> 2 ???)
  • Для каждой уникальной пары найдите строки с min и max DOB (избегайте их)
  • В новом столбце CheckBox отметьте те, которые остались (не экстремальные)

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Сначала group by name, surname, чтобы получить количество вхождений и минимальную и максимальную привязку каждого имени и фамилии и объединить результаты с таблицей.
С оператором CASE применяются условия:

select 
  p.*,
  case  
    when g.counter in (1, 2) then 'mark'
    else case
      when p.dob not in (g.mindob, g.maxdob) then 'mark' 
    end
  end Checkbox
from peaople inner join (
  select 
    name, surname,
    count(*) counter,
    min(dob) mindob,
    max(dob) maxdob
  from people
  group by name, surname
) g on g.name = p.name and g.surname = p.surname
0 голосов
/ 17 июня 2019

Использование оконных функций в MySQL 8 +:

select p.*,
       (case when count(*) over (partition by name, surname) <= 2
             then 'mark'
             when row_number() over (partition by name, surname order by dob) > 1 and
                  row_number() over (partition by name, surname order by dob desc) > 1
             then 'mark'
        end) as checkbox
from people p;

Примечание: если есть дубликаты для самой ранней или последней даты рождения, это исключает только одну из них. Если вы хотите исключить все из них, используйте rank() вместо row_number().

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