#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;