Наличие набора данных airbnb и необходимость определения хостов с несколькими квартирами в одном месте с помощью функции соединения - PullRequest
0 голосов
/ 20 апреля 2019

На основе набора данных airbnb мне нужно выяснить, у каких хостов есть несколько комнат в одном месте.

У меня есть две таблицы: airbnb и airbnb_locations

Первые шесть рядов airbnbтаблица выглядит следующим образом:

host_id    room_id    latitude    longitude
2536       2318       47.61       -122.29
35749      4291       47.68       -122.31
8993       5682       47.52       -122.35
14942      6606       47.65       -122.33
30559      9419       47.55       -122.31
30832      9460       47.60       -122.32

Первые шесть строк таблицы airbnb_locations выглядят так:

room_id    latitude    longitude
2318       47.61       -122.29
4291       47.68       -122.31
5682       47.52       -122.35
6606       47.65       -122.33
9419       47.55       -122.31
9460       47.60       -122.32

Таким образом, единственная разница между таблицами - это атрибут host_id.

Это была моя первая попытка:

select distinct t1.host_id, t1.room_id, t1.latitude, t1.longitude
from airbnb t1 inner join airbnb_locations t2
where t1.latitude = t2.latitude
and t1.longitude = t2.longitude
and t1.room_id <> t2.room_id

Проблема с этим кодом заключается в том, что он также дает комнаты, принадлежащие разным хостам в одном месте.Я попытался сгруппировать комнаты по хостам, но по какой-то причине это дает мне неправильные результаты.

Решением может быть добавление атрибута host_id в airbnb_locations, а затем:

select distinct t1.host_id, t1.room_id, t1.latitude, t1.longitude
from airbnb t1 inner join airbnb_locations t2
where t1.host_id = t2.host_id
and t1.latitude = t2.latitude
and t1.longitude = t2.longitude
and t1.room_id <> t2.room_id

Но тогда яУ меня осталось два одинаковых стола, и я не совсем уверен, в чем был смысл этого упражнения.Поэтому мне любопытно, упустил ли я очевидное решение для решения проблемы на основе двух исходных таблиц с использованием функции соединения?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

Я думаю, что вы хотите агрегации:

select a.host_id, a.latitude, a.longitude
from airbnb a
group by a.host_id, a.latitude, a.longitude
having count(*) > 1;

Это фактически возвращает местоположения. Если вы действительно хотите использовать хосты, то это очень редкое время, когда select distinct подходит для group by:

select distinct a.host_id
from airbnb a
group by a.host_id, a.latitude, a.longitude
having count(*) > 1;
2 голосов
/ 20 апреля 2019

Я не думаю, что вам нужно делать JOIN здесь.Вы можете просто GROUP BY host_id, широта и долгота и возвращать только хосты, которые имеют несколько комнат.Ваш запрос может выглядеть примерно так:

SELECT 
    host_id
    ,latitude
    ,longitude
FROM airbnb
GROUP BY
    host_id
    ,latitude
    ,longitude
HAVING COUNT(DISTINCT room_id) > 1
...