Выберите все даты, все клиенты и последнюю транзакцию до даты клиента в данный день улья - PullRequest
0 голосов
/ 02 июня 2018

У меня есть 3 таблицы в Hive: - календарная таблица (со всеми датами за определенный период) - таблица клиентов - список транзакций клиента

Мне нужно присоединиться к ним, чтобы получить за данныйдата, все клиенты и их последняя транзакция до этой даты.Эта последняя транзакция должна быть нулевой, только если до этой даты не было транзакций (я имею в виду, последняя транзакция до текущей записи календаря).

Пример календаря:

+----------+
|date      |
+----------+
|2017-06-01|
|2017-06-02|
|2017-06-03|
|2017-06-04|
|2017-06-05|
|2017-06-06|
|2017-06-07|
|2017-06-08|
|2017-06-09|
|2017-06-10|
+----------+

Пример клиента:

+------------+
|customer_id |
+------------+
|11544049690 |
|15506698252 |
|67015354024 |
|43622453087 |
|509         |
|42859528435 |
|506         |
|10669246896 |
|33355892704 |
|500         |
+------------+

Пример транзакции:

+------------+----------+
|customer_id |trx_date  |
+------------+----------+
|43622453087 |2018-05-30|
|509         |2017-10-04|
|509         |2018-01-09|
|509         |2017-11-07|
|509         |2018-01-30|
|506         |2017-10-04|
|506         |2017-12-21|
|506         |2017-11-07|
|506         |2017-11-07|
|500         |2017-10-04|
+------------+----------+

Результат будет более или менее похож на это:

+----------+------------+--------------+
|date      |customer_id |last_trx_date |
+----------+------------+--------------+
|2017-10-04|11544049690 |              |
|2017-10-04|15506698252 |              |
|2017-10-04|67015354024 |              |
|2017-10-04|43622453087 |              |
|2017-10-04|509         |2017-10-04    |
|2017-10-04|42859528435 |              |
|2017-10-04|506         |2017-10-04    |
|2017-10-04|10669246896 |              |
|2017-10-04|33355892704 |              |
|2017-10-04|500         |2017-10-04    |
|2017-10-05|11544049690 |              |
|2017-10-05|15506698252 |              |
|2017-10-05|67015354024 |              |
|2017-10-05|43622453087 |              |
|2017-10-05|509         |2017-10-04    |
|2017-10-05|42859528435 |              |
|2017-10-05|506         |2017-10-04    |
|2017-10-05|10669246896 |              |
|2017-10-05|33355892704 |              |
|2017-10-05|500         |2017-10-04    |
|2017-10-06|11544049690 |              |
|2017-10-06|15506698252 |              |
|2017-10-06|67015354024 |              |
|2017-10-06|43622453087 |              |
|2017-10-06|509         |2017-10-04    |
|2017-10-06|42859528435 |              |
|2017-10-06|506         |2017-10-04    |
|2017-10-06|10669246896 |              |
|2017-10-06|33355892704 |              |
|2017-10-06|500         |2017-10-04    |
.
.
.
|2017-11-07|11544049690 |              |
|2017-11-07|15506698252 |              |
|2017-11-07|67015354024 |              |
|2017-11-07|43622453087 |              |
|2017-11-07|509         |2017-11-07    |
|2017-11-07|42859528435 |              |
|2017-11-07|506         |2017-11-07    |
|2017-11-07|10669246896 |              |
|2017-11-07|33355892704 |              |
|2017-11-07|500         |2017-10-04    |
+----------+------------+--------------+

Последняя попытка была такой: Вот последняя попытка:

SELECT

    cal.date as calendar_date,
    c.customer_id,
    to_date(trx.tstamp) as trx_date,
    max(to_date(trx.tstamp)) over (
        order by trx.date, trx.customer_id rows unbounded preceding) as last_trx
    FROM
       calendartable cal
    LEFT JOIN customer t1
    LEFT JOIN transactions t2          
    ON (c.customer_id == trx.customer_id) 

    WHERE to_date(cal.date) <= current_date or cal.date is null

1 Ответ

0 голосов
/ 02 июня 2018

Необходимо перекрестное объединение для создания строк для каждой даты в таблице календаря для каждого клиента.Тогда left join с агрегацией даст желаемый результат.

SELECT cal.date as calendar_date,
cst.customer_id,
max(to_date(trx.tstamp)) as last_trx
FROM calendartable cal
CROSS JOIN customer cst
LEFT JOIN transactions trx ON cst.customer_id = trx.customer_id AND trx.tstamp <= cal.dt
WHERE to_date(cal.date) <= current_date 
GROUP BY cal.date,cst.customer_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...