Рассчитать периоды и среднюю сумму, где баланс был положительным - PullRequest
1 голос
/ 03 мая 2020

Я застрял с оконной функцией.

У меня есть эта таблица с именем task :

user_id VARCHAR date DATE balance INTEGER

+---------+------------+---------+
| user_id |    date    | balance |
+---------+------------+---------+
|       1 | 03.04.2020 |       0 |
|       1 | 04.04.2020 |     265 |
|       1 | 05.04.2020 |     140 |
|       1 | 06.04.2020 |      70 |
|       1 | 07.04.2020 |       0 |
|       2 | 03.04.2020 |     535 |
|       2 | 04.04.2020 |     115 |
|       2 | 05.04.2020 |       0 |
|       2 | 06.04.2020 |       0 |
|       2 | 07.04.2020 |     694 |
+---------+------------+---------+

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

+---------+------------+------------+-------------+-------------+
| user_id | start_date |  end_date  | avg_balance | date_length |
+---------+------------+------------+-------------+-------------+
|       1 | 04.04.2020 | 06.04.2020 | 158.3       |           3 |
|       2 | 03.04.2020 | 04.04.2020 | 325         |           2 |
|       2 | 07.04.2020 | 07.04.2020 | 694         |           1 |
+---------+------------+------------+-------------+-------------+

Я пытался реализовать оконную функцию, но застрял.

1 Ответ

1 голос
/ 03 мая 2020

Назначьте периоды, посчитав количество нулей до. Затем агрегируйте:

select user_id, min(date), max(date), avg(balance), count(*) as date_length
from (select t.*,
             sum( balance = 0 ) over (partition by user_id order by date) as grp
      from t
     ) t
where balance > 0
group by user_id, grp;

Здесь - это дб <> скрипка.

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