Как SQL выбирает дубликаты по одному полю и отличается другим

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица person_log со следующими полями:

  • id
  • timestamp
  • first_name
  • last_name
  • action

с некоторыми примерами данных

 1;012545878;homer;simpson;eating
2;812345222;homer;simpson;watching tv
3;312322578;marge;simpson;cooking
4;114568568;bart;simpson;skating
5;015345345;bart;simpson;skating
  

Теперь мне нужно выбрать все наборы записей, где first_name и last_name совпадает и встречается как минимум два раза, но action отличается.

В результате выбираются id s 1 и 2.

Как я могу это сделать? TIA?

Ответ №1:

Используйте производную таблицу, чтобы получить людей, имеющих по крайней мере 2 разных действия, и присоедините ее к исходной таблице, чтобы получить другие столбцы в результате.

 select p.*
from person_log p 
join (select first_name,last_name
      from person_log
      group by first_name,last_name
      having count(*) >=2 and count(distinct action) >= 2) p1
on p1.first_name=p.first_name and p1.last_name=p.last_name
  

Ответ №2:

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

 SELECT * FROM person_log p
JOIN (
SELECT first_name, last_name, action
group by first_name,last_name
having count(*) >=2 ) p2
on p.first_name=p2.first_name and p.last_name=p2.last_name
  

Ответ №3:

Вы можете использовать row_number(), раздел позволит вам группировать по имени, фамилии и действию:

 select distinct id 
from (select pl.*,
         row_number() over (partition by first_name, last_name, action) as seqnum
  from person_log pl
 ) R
where seqnum > 1;