Как вычесть один столбец из другого, обнаружив предыдущее вхождение того же идентификатора? - PullRequest
0 голосов
/ 14 июля 2020
• 1000 *

В таблице rentals у вас есть rental_id для каждой транзакции аренды, inventory_id, соответствующий элементу, который был взят в аренду, а также rental_date и return_date.

Для каждой сделки аренды я хотел бы посмотреть на rental_date и найти разницу с return_date предыдущего появления того же inventory_id.

Я знаю LAG() и LEAD() здесь может быть полезно, но я понятия не имею, как заставить его рассматривать только другие строки с тем же inventory_id.

Пример данных:

rental_id  inventory_id  rental_date  return_date
-------------------------------------------------------
1          115           01-01-2005   01-05-2005
2          209           01-01-2005   01-04-2005
3          115           01-06-2005   01-10-2005
4          209           01-09-2005   01-14-2005
5          209           01-15-2005   01-20-2005
6          115           01-16-2005   01-20-2005

Желаемый результат:

rental_id    inventory_id    rental_date    return_date    days_on_shelf
------------------------------------------------------------------------
1            115             01-01-2005     01-05-2005     NULL
2            209             01-01-2005     01-04-2005     NULL
3            115             01-06-2005     01-10-2005     1
4            209             01-09-2005     01-14-2005     5
5            209             01-15-2005     01-20-2005     1
6            115             01-16-2005     01-20-2005     6

Спасибо 7 июня. Правильный код должен выглядеть так:

SELECT 
    rental.rental_id,
    rental.inventory_id,
    inventory.film_id,
    rental.rental_date,
    rental.return_date,
    IF(@lastid = rental.inventory_id,
        DATEDIFF(rental.rental_date, @lastreturn),
        NULL) AS days_on_shelf,
    @lastid:=rental.inventory_id,
    @lastreturn:=rental.return_date
FROM
    rental
        JOIN
    inventory ON rental.inventory_id = inventory.inventory_id
ORDER BY rental.inventory_id , rental.rental_date

1 Ответ

2 голосов
/ 14 июля 2020

Кажется, вы просто хотите lag():

select t.*,
       datediff(rental_date,
                lag(return_date) over (partition by inventory_id order by rental_date)
               ) as days_on_shelf
from t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...