Возврат значений на основе нескольких условий в SQL-сервере - PullRequest
0 голосов
/ 04 октября 2018

У меня есть простая таблица, которая содержит 4 столбца:

  1. идентификатор заказа, который уникален и не может быть пустым
  2. идентификатор фильма, который не может быть пустым
  3. rent_date, который не может быть нулевым
  4. return_date, который может быть нулевым

Я пытаюсь вернуть все идентификаторы фильмов, которые имеют по крайней мере1 из двух условий:

  1. один и тот же фильм был заказан дважды в одну и ту же дату (если дата возврата не равна нулю)
  2. один и тот же фильм был заказан в тот же деньдата возврата (2 разных идентификатора заказа - дата аренды первого идентификатора фильма - это дата возврата второго идентификатора фильма)

Таблица выглядит примерно так:

order_id    movie_id    rent_date   return_date
1           1           2014-07-17  NULL
2           1           2014-07-18  NULL
3           1           2014-07-19  2014-07-17
4           2           2014-07-17  2014-07-18
5           2           2014-07-17  2014-07-18
6           3           2014-07-17  NULL
7           3           2014-07-18  2014-07-19

Я хочу вернуть следующие идентификаторы фильмов:

  • идентификатор фильма 1 - потому что дата проката в порядке 1 соответствует дате возврата в порядке 3
  • идентификатор фильма 2 - потому чтоон имеет одинаковую дату аренды как для идентификатора заказа 4, так и для идентификатора заказа 5

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Создать простую таблицу

declare @simple table
(
    order_id    int,
    movie_id    int,
    rent_date   date,
    return_date date
)

И некоторые простые данные

insert into @simple values
(1, 1, '2014-07-17', NULL),
(2, 1, '2014-07-18', NULL),
(3, 1, '2014-07-19', '2014-07-17'),
(4, 2, '2014-07-17', '2014-07-18'),
(5, 2, '2014-07-17', '2014-07-18'),
(6, 3, '2014-07-17', NULL),
(7, 3, '2014-07-18', '2014-07-19')

запрос

select  distinct movie_id
from    @simple t
where   exists  -- Rule 1
    (
        select  rent_date
        from    @simple x
        where   return_date is not null
        and movie_id    = t.movie_id
        group by rent_date
        having count(*) = 2
    ) 
or  exists  -- Rule 2
    (
        select  *
        from    @simple x
        where   x.movie_id  = t.movie_id
        and x.rent_date = t.return_date
    )
0 голосов
/ 04 октября 2018

1) один и тот же фильм был заказан дважды в одну и ту же дату (если дата возврата не равна нулю)

Это можно сделать, сгруппировав идентификатор фильма и дату проката и добавивс аргументом (HAVING COUNT (*)> = 1)

2) Один и тот же фильм был заказан в тот же день, когда был возвращен (2 разных идентификатора заказа - дата проката первого идентификатора фильма является возвращениемдата второго идентификатора фильма)

Это можно сделать, присоединив таблицу к самой себе и добавив два условия в оператор соединения.tabele1.movie_id = table2.movie_id и tabele1.rent_date = tabele2.return_date.Также добавьте, что оба идентификатора заказа должны быть разными

Это приведет к двум таблицам, из которых вы можете получить movie_id и дату аренды.Если вы объедините две таблицы с помощью UNION (не UNION ALL), вы получите уникальные результаты.

У меня в голове получится что-то вроде приведенного ниже кода.

SELECT movie_id, rent_date 
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id 
                   AND tabele1.rent_date = tabele2.rent_date 
GROUP BY movie_id, rent_date    
HAVING COUNT(*) > 1

UNION

SELECT movie_id, rent_date 
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id 
                   AND tabele1.rent_date = tabele2.return_date
                   AND tabele1.order_id <> tabele2.order_id
GROUP BY movie_id, rent_date

Чтобы получить уникальные идентификаторы фильмов, вы можете использовать их как CTE или Inner-Query и добавить GROUP BY к movie_id, rent_date.

0 голосов
/ 04 октября 2018

Вы можете попробовать как ниже

    select t1.rent_date,t1.movie_id  from t t1 join t t2 
     on t1.rent_date=t2.return_date and t1.movie_id=t2.movie_id and t1.order_id!=t2.order_id
     union
select t1.rent_date, t1.movie_id  from t t1
 where t1.return_date IS NOT NULL
  group by t1.rent_date,t1.movie_id
  having count(*)>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...