столбец со значениями из разных таблиц для каждой строки - PullRequest
0 голосов
/ 06 февраля 2019

У меня довольно сложная проблема, которую я даже не уверен, что это можно сделать только с помощью presto / sql;поэтому я буду признателен за любой ввод.

Настройка.У меня есть таблица заказов ... (table1)

order_id | customer_id | order_date | blahblahblah....
--------------------------------------------------
 11111   |   5432567   | 2018-12-16 | ..........
 10002   |   6543212   | 2019-01-21 | ..........
 22222   |   3456788   | 2018-11-09 | ..........

У меня есть другая таблица (table2),

customer_id | customer_rating | as_of_date | 
--------------------------------------------
 5432567    |       A-        | 2019-02-04 | 
 6543212    |       B+        | 2019-02-04 | 

, которая обновляется ежедневно, и я должен вызвать ее с указанием as_of_date, как то так

selct * from table2 
where customer_id="6543212" 
and as_of_date='2019-02-04' -- or whatever date

Теперь проблема.Я хочу создать таблицу, в которой для каждого order_id в table1 выбирается customer_rating для этого customer_id, ДО order_date в table1 (например, когда as_of_date = order_date - 1),и ПОСЛЕ даты заказа (скажем, as_of_date = сегодня).

Чтобы сделать это немного яснее, это моя попытка создать макет таблицы

customer_id | order_id | order_date | customer_rating_before | customer_rating_today
------------------------------------------------------------------------------------
  5432567   |  11111   | 2018-12-16 |           A+           |       A-
  6543212   |  10002   | 2019-01-21 |           B+           |       B+
  3456788   |  22222   | 2018-11-09 |           C            |       B

Есть идеи ?!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете сделать это с помощью трюка.Соберите две таблицы вместе, используя union all.Затем используйте оконные функции, чтобы получить предыдущую и следующую дату рейтинга во всех строках - используя совокупные значения min() и max().

. С этой информацией вы можете использовать другую оконную функцию для получения рейтинга и, наконец, фильтрациистроки, чтобы получить те, которые изначально были в orders:

select ot.*
from (select ot.*,
             max(rating) over (partition by customer_id, prev_rating_date) as prev_rating,
             max(rating) over (partition by customer_id, next_rating_date) as next_rating
      from (select ot.*,
                   max(case when rating is not null then order_date end) over (partition by customer_id order by orderdate asc) as prev_rating_date,
                   min(case when rating is not null then order_date end) over (partition by customer_id order by orderdate desc) as next_rating_date,
            from ((select order_id, customer_id, order_date, NULL as rating
                   from orders
                  ) union all
                  (select NULL, customer_id, as_of_date, rating
                   from table2
                  )
                 ) ot
           ) ot
      ) ot
where rating is null;
0 голосов
/ 06 февраля 2019

Если вы хотите организовать комбинированные таблицы, удалите * и поместите имя столбца отдельно.

Попробуйте это

SELECT 
    table1.customer_id,
    table1.order_id,
    table1.order_date,
    table1.customer_rating as customer_rating_before
    table2.customer_rating as customer_rating_after
FROM 
    table1, table2
WHERE 
    table1.customer_id = table2.customer_id

Это объединит 2 таблицы, которая является старой таблицей (table1) и новой таблицей (table2), и создаст два столбца customer_rating из старой таблицы (table1) и customer_ratingиз новой таблицы (table2)

...