Генерация результатов на основе разницы между датами для театра - PullRequest
1 голос
/ 28 марта 2020

Я работаю над запросом SQL, где у меня есть 2 таблицы с именем Театр, Фильмы, подобные этим:

Театр

Theatre with columns theatre id and show date:

id      show_date
------------------
1       2018-05-01
2       2018-05-01
1       2018-05-03
3       2018-05-04
2       2018-05-14
3       2018-05-11
2       2018-05-14

Mov ie

Movie with columns movie id and movie name:

id  name
----------
1   Avatar
2   Spiderman
3   Avengers

Театр регулярно показывает одни и те же фильмы, пока разница в дате показа для этого конкретного театра не превысит 2 дня.

Для театра, если разница в показе даты превышает 2 дня, он изменяется на следующий фильм ie в таблице списка фильмов.

Все театры показывают фильмы в том же порядке .

Теперь я хочу написать запрос для этого сценария.

Ожидаемый результат: (я добавил комментарии для каждой строки в качестве объяснения)

theatre_id  show_date   movie
---------------------------------------------

1           2018-05-01  Avatar  /* 1st theatre, 1st date occurrence so picking 1st movie
2           2018-05-01  Avatar  /* 2nd theatre, 1st date occurrence so picking 1st movie */
1           2018-05-03  Avatar  /* 1st theatre, with 1 day gap (1st may 2018 to 3rd may 2018), so picking 1st movie
3           2018-05-04  Avatar  /* 3rd theatre, 1st date occurrence so picking 1st movie */
2           2018-05-10  Spiderman /* 2nd theatre, with 8 days gap (1st may 2018 to 10th may 2018), so picking 2nd movie */
3           2018-05-11  Spiderman /* 3rd theatre, with 6 days gap (4th may 2018 to 11th may 2018) so picking 2nd movie */
2           2018-05-14  Avengers /* 2nd theatre, with 3 days gap (10th may 2018 to 14th may 2018), so picking 3rd movie */

Скрипты:

drop table if exists theatre;

CREATE TABLE theatre ( 
  id INTEGER NOT NULL,
  show_date date NOT NULL
);

drop table if exists movie;

CREATE TABLE movie ( 
  id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(60) NOT NULL
);


insert into movie values (null, 'Avatar');
insert into movie values (null, 'Spiderman');
insert into movie values (null, 'Avengers');

insert into theatre values( 1, cast('2018-05-01' as date));
insert into theatre values( 2, cast('2018-05-01' as date));
insert into theatre values( 1, cast('2018-05-03' as date));
insert into theatre values( 3, cast('2018-05-04' as date));
insert into theatre values( 2, cast('2018-05-10' as date));
insert into theatre values( 3, cast('2018-05-11' as date));
insert into theatre values( 2, cast('2018-05-14' as date));

1 Ответ

2 голосов
/ 28 марта 2020

Это немного сложно; Вот подход, использующий оконные функции, доступный в MySQL 8.0.

. Как я понимаю ваш вопрос, вам нужно поместить строки из theatre в группы, которым впоследствии будет назначен тот же mov ie , Для этого вы можете использовать lag(), чтобы получить предыдущую show_date, и сделать сумму окна, которая увеличивается каждый раз, когда встречается разрыв более 2 дней. Затем вы можете взять таблицу movie и назначить mov ie для каждой группы:

select t.id, t.show_date, m.name movie
from (
    select 
        t.*, 
        sum(case when show_date <= lag_show_date + interval 2 day then 0 else 1 end) 
            over(partition by id order by show_date) grp
    from (
        select 
            t.*, 
            lag(show_date) over(partition by id order by show_date) lag_show_date
        from theatre t
    ) t
) t
inner join (
    select m.*, row_number() over(order by id) grp from movie m
) m
    on m.grp = t.grp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...