Присоединение к таблице по условию даты, наступающему после даты Из таблицы - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица отзывов и таблица транзакций. Я хочу узнать количество транзакций после того, как клиент отправил отзыв.

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

+-------------+--------------+-------------+----------------+
| customer_id | review_score | review_date | transaction_id |
+-------------+--------------+-------------+----------------+
| 123         | 4            | 2019-01-01  | 894            |
+-------------+--------------+-------------+----------------+
| 123         | 9            | 2019-05-23  | 897            |
+-------------+--------------+-------------+----------------+
| etc         | etc          | etc         | etc            |
+-------------+--------------+-------------+----------------+

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

+-------------+------------------+----------------+
| customer_id | transaction_date | transaction_id |
+-------------+------------------+----------------+
| 123         | 2019-10-01       | 901            |
+-------------+------------------+----------------+
| 123         | 2019-12-04       | 903            |
+-------------+------------------+----------------+
| etc         | etc              | etc            |
+-------------+------------------+----------------+

Я хотел бы видеть следующее:

+-------------+--------------+-------------+----------------+-------------+------------------+----------------+
| customer_id | review_score | review_date | transaction_id | customer_id | transaction_date | transaction_id |
+-------------+--------------+-------------+----------------+-------------+------------------+----------------+
| 123         | 4            | 2019-01-01  | 894            | null        | null             | null           |
+-------------+--------------+-------------+----------------+-------------+------------------+----------------+
| 123         | 9            | 2019-05-23  | 897            | 123         | 2019-10-01       | 901            |
+-------------+--------------+-------------+----------------+-------------+------------------+----------------+
| 123         | 9            | 2019-05-23  | 897            | 123         | 2019-12-04       | 903            |
+-------------+--------------+-------------+----------------+-------------+------------------+----------------+
| etc         | etc          | etc         | etc            | etc         | etc              | etc            |
+-------------+--------------+-------------+----------------+-------------+------------------+----------------+

Транзакции совершаются после последнего представленного отзыва. Будут случаи, когда клиент совершает несколько покупок и отправляет отзывы о них. Я хотел бы присоединиться к транзакции после отправки отзыва и до отправки следующего отзыва.

Мой запрос:

with review_cte as (
    select transaction_id
    , customer_id
    , review_date
    , lead(review_date, 1) over (partition by customer_id order by review_date) as review_date_lead
    , review_score
    from review
)
select rev.*
    , b.transaction_id
    , b.customer_id
    , b.transaction_date
from review_cte as rev
join booking b
    on b.unique_customer_id = rev.customer_id
    and b.transaction_date > rev.review_date
    and b.transaction_date < rev.review_date_lead
    and b.booking_id <> rev.booking_id
order by rev.customer_id, rev.review_date
    , b.customer_id, b.transaction_date
;

Проблема с моим запросом заключается в том, что он не будет возвращать все строки илиприсоединяться к идентификатору транзакции просмотра более одного раза, поскольку он удовлетворяет условию, когда дата транзакции> дата обзора. Я говорю, зависит, потому что я экспериментировал, выполняя некоторые условия соединения и тому подобное

1 Ответ

1 голос
/ 29 октября 2019

Это должно делать то, что вы хотите:

select rev.*,
       b.transaction_id, b.customer_id, b.transaction_date
from (select r.*,
             lead(review_date) over (partition by customer_id order by review_date) as next_review_date
      from review r
     ) r left join
     booking b
     on b.unique_customer_id = r.customer_id and
        b.transaction_date > r.review_date and
        (b.transaction_date < r.review_date_lead or r.review_date_lead is null
        ) and
        b.booking_id <> r.booking_id
order by r.customer_id, r.review_date, b.customer_id, b.transaction_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...