Запрос отношений между строками - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно найти связь между несколькими людьми в одной таблице, например, у меня есть таблица ниже:

Таблица гостей

, поэтому мне нужно sql сценарий, говорящий, что Гость 123 и 456 зарегистрировались вместе в одном отеле в одно и то же время 80% и так далее ...

Любезная поддержка.

1 Ответ

0 голосов
/ 04 августа 2020

Это немного сложно, поэтому я разбил его на несколько подзапросов для вас, используя CTE с совпадающим ключом.

Это даст серию совпадающих пар - для основного гостя и дополнительного гостя с rat ios того, как часто они остаются вместе, а не просто регистрируются.

Настройка:

create table temp(
    hotelID integer,
    checkInDate date,
    guestID integer
)

insert into temp values (101, '2020/06/01', 123)
insert into temp values (101, '2020/06/01', 456)
insert into temp values (102, '2020/06/15', 123)
insert into temp values (102, '2020/06/15', 456)
insert into temp values (103, '2020/06/30', 123)
insert into temp values (103, '2020/06/30', 456)
insert into temp values (104, '2020/07/15', 123)
insert into temp values (104, '2020/07/15', 789)
insert into temp values (105, '2020/07/01', 456)
insert into temp values (105, '2020/07/01', 789)

Запрос:

    with keyCte as (
        select 
            distinct cast(hotelID as varchar(3)) + cast(checkInDate as varchar(10)) as myKey,
            guestID
        from temp
    ) 

    select 
          guestPrime
        , guestTwo
        , instances as guestPrimeStays
        , matches as guestTwoMatches
        , cast(matches as float) / cast(instances as float) as hitRate

    from (
            select 
                  guestID
                , count(*) as instances 
            from keyCte 
            group by guestID
         ) sq3

    join (
        select
            guestPrime
            , guestTwo
            , count(*) as matches
        from (
            select 
                keyCte.guestID as guestPrime
              , kcte.guestID as guestTwo
            from keyCte
            join keyCte kcte on kcte.myKey = keyCte.myKey and kcte.guestID != keyCte.guestID
        ) sq 
        group by guestPrime, guestTwo

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