улей: как получить последние 3 месяца общих расходов при использовании соединения - PullRequest
0 голосов
/ 06 марта 2019

Как получить общие расходы за последние 3 месяца при использовании соединения source1 и source2, а затем получить таблицу назначения?

source1:

+--------+----------+
| cst_id |   date   |
+--------+----------+
| a      | 20180125 |
| b      | 20180627 |
| c      | 20181122 |
| d      | 20180304 |
+--------+----------+

source2: объединить таблицы source1 и source2

+--------+--------+-------+
| cst_id | month  | spend |
+--------+--------+-------+
| a      | 201710 |   6.2 |
| a      | 201711 |   0.5 |
| a      | 201712 |   4.3 |
| a      | 201801 |   6.5 |
| a      | 201802 |     7 |
| a      | 201803 |    11 |
| a      | 201804 |    23 |
| a      | 201805 |    67 |
| a      | 201806 |   8.1 |
| a      | 201807 |   0.2 |
| a      | 201808 |   9.1 |
| a      | 201809 |     1 |
| a      | 201810 |     5 |
| a      | 201811 |     6 |
| a      | 201812 |     9 |
| b      | 201710 |   6.2 |
| b      | 201711 |   0.5 |
| b      | 201712 |   4.3 |
| b      | 201801 |   6.5 |
| b      | 201802 |     7 |
| b      | 201803 |    11 |
| b      | 201804 |    23 |
| b      | 201805 |    67 |
| b      | 201806 |   8.1 |
| b      | 201807 |   0.2 |
| b      | 201808 |   9.1 |
| b      | 201809 |     1 |
| b      | 201810 |     5 |
| b      | 201811 |     6 |
| b      | 201812 |     9 |
+--------+--------+-------+

таблица назначения: наконец, каждый cst_id получает только одну строку

+--------+----------+-----------------+
| cst_id |   date   | last3monthSpend |
+--------+----------+-----------------+
| a      | 20180125 |              11 |
| b      | 20180627 |             101 |
+--------+----------+-----------------+

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете делать что хотите, используя join, group by и оконные функции.Ниже показана логика:

select s1.cst_id, s1.date, sum(s1.spend)
from (select s1.*,
             row_number() over (partition by s2.cst_id order by s2.month desc) as seqnum
      from source1 s1 join 
           source2 s2
           on s2.cst_id = s1.cst_id and
              s2.month < s1.date
     ) s
where seqnum <= 3
group by s1.cst_id, s1.date;

Единственная проблема заключается в том, как сравнить столбцы date и month.Эта версия работает, если значения являются строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...