Problem: I have a list of names and addresses. Some names (persons) have the same address (street, zip code, town) like others. I want to select all those names with addresses with no more than three occurrences and from the rest the first three names each of a bunch pointing to the same address. Example:
Albert | Adr1 Berta | Adr1 Cesar | Adr1 Donald | Adr1 Eric | Adr2 Fritz | Adr2 Gerd | Adr2 Henry | Adr3
The result set should be
Albert | Adr1 Berta | Adr1 Cesar | Adr1 Eric | Adr2 Fritz | Adr2 Gerd | Adr2 Henry | Adr3
Дональд отсутствует, потому что он четвертый в группе с таким же адресом. Можно ли добиться такого результата с помощью UNION и подзапросов? Что-то типа
select * from addresses where address in (select address from addresses group by address having count(address) <= 3) UNION select * from addresses where address in (select address from addresses group by address having count(address) > 3 limit 3)
Я знаю, что этот запрос неверен, потому что он ограничивает полный результирующий набор адресов более чем тремя вхождениями. Интересно, можно ли это сделать в одном SELECT с UNION и подзапросами. Я сделаю это сейчас процедурно с PHP/MySQL, но просто для удовольствия было бы интересно решение только для SQL.
Я просмотрел запрос SQL с ограничением на количество строк из одной таблицы, а не на набор результатов, но это не отражает мою ситуацию - или это так?