Вместе по крайней мере X раз SQL - PullRequest
0 голосов
/ 25 февраля 2019

[SQL] Допустим, у меня есть таблица с людьми и местами, подобными этой

NAME - PLACE
John | Park
John | Restaurant
John | Market
Bob  | Park
Bob  | Restaurant
Bob  | Market
Bob  | Pub
Bob  | Work
Tom  | Park
Tom  | Cinema
Ray  | Work
Ray  | Pub

, и я хочу знать, какие люди были вместе в паре в одних и тех же местах по крайней мере X раз, поэтому ожидаемый результатбудет:

for X = 1:
John
Bob
Tom
Ray

Потому что:
Джон и Боб были вместе в парке, ресторане и на рынке
Боб и Рэй были вместе в работе и пабе
Том и Джон были вместе в парке

for X = 2:
John
Bob
Ray

Потому что:
Джон и Боб были вместе в Парке, Ресторане и Рынке
Боб и Рэй были вместе в Работе и Пабе

for X = 3:
John
Bob

Потому что:
Джон и Боб были вместе в Парке, Ресторане и Рынке

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

Желательно использовать SQL, если это возможно.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Для X = N (после >=):

with t(NAME, PLACE) as (values
  ('John', 'Park')
, ('John', 'Restaurant')
, ('John', 'Market')
, ('Bob', 'Park')
, ('Bob', 'Restaurant')
, ('Bob', 'Market')
, ('Bob', 'Pub')
, ('Bob', 'Work')
, ('Tom', 'Park')
, ('Tom', 'Cinema')
, ('Ray', 'Work')
, ('Ray', 'Pub')
)
select distinct a.name
from t a
where exists (
select 1
from t b
where b.NAME<>a.NAME
and (select count(1) from t ta join t tb on ta.place=tb.place and ta.name=a.name and tb.name=b.name)>=N
);
0 голосов
/ 25 февраля 2019

Вы можете сделать это с несколькими объединениями.Для X = 1, тогда:

select p.place, t11.person, t21.person
from (select distinct place as place1
      from t
     ) p join
     t t1
     on t1.place = p.place join
     t t2
     on t2.place = p.place and
        t2.person not in (t1.person);

Для X = 2:

select p.place1, p.place2, t1.person, t2.person
from (select distinct t1.place as place1, t2.place as place2
      from t t1 join
           t t2
           on t1.place < t2.place
     ) p join
     t t11
     on t11.place = p.place1 join
     t t21
     on t21.place = p.place1 and
        t21.person not in (t11.person) join
     t t12
     on t12.place = p.place2 and
        t12.person = t11.person join
     t t22
     on t22.place = p.place2 and
        t22.person = t21.person;

Добавление дополнительных мест следует этому методу, с двумя объединениями для каждого нового места.

Здесь - это дБ <> скрипка.

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