Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Воронка продаж в postgres / 3 сообщений из 3, страница 1 из 1
22.01.2022, 11:09
    #40128658
gggg111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воронка продаж в postgres
Построить воронку продаж по странам вида: “country”, “installs”, “trials”,
“purchases”, “conversion_rate_to_trial”, “conversion_rate_to_purchase”

Ограничения: на 1 пользователя может быть только 1 оформление триала и 1 оформление purchase
Покупка возможна только по истечению платного периода.

Таблица:

DROP TABLE IF EXISTS events;
CREATE TABLE events
(
transaction_id SERIAL PRIMARY KEY,
datetime timestamp,
event_type VARCHAR(255) NOT NULL,
user_id INT NOT NULL,
country VARCHAR(255) NOT NULL
);
INSERT INTO events (transaction_id, datetime, event_type, user_id, country)
VALUES
(345642,'2021-01-03', 'installs', 3253, 'Russia'),
(353787,'2021-01-03', 'trial', 3253, 'Russia'),
(363568,'2021-01-10', 'purchase', 3253, 'Russia'),
(436561,'2021-01-05', 'installs', 3333, 'Russia'),
(252512,'2021-01-06', 'trial', 3333, 'Russia'),
(325368,'2021-01-13', 'purchase', 3333, 'Russia'),
(417809,'2021-01-03', 'installs', 3266, 'Brazil'),
(436556,'2021-01-14', 'installs', 3266, 'Brazil'),
(436578,'2021-01-16', 'trial', 3266, 'Brazil'),
(436800,'2021-01-23', 'purchase', 3266, 'Brazil')


Здесь рассчитал общее количество событий по типам:
SELECT country,
sum(case when event_type='trial' then 1 else 0 end) as trial,
sum(case when event_type='installs' then 1 else 0 end) as installs,
sum(case when event_type='purchase' then 1 else 0 end) as purchase
FROM events
GROUP BY country;


Но нужно еще учесть, то что загрузок может быть несколько. Т.е установил один раз, удалил, установил второй раз. Только после этого второй установки взял пробный период и только после него возможна покупка.
Пока не пойму как это реализовать.

with installs as (
select
distinct e.user_id
from events e
where e.event_type = 'installs'
),
trials as (
select
distinct e.user_id
from installs s
inner join events e on e.user_id = s.user_id
where e.event_type = 'trial'
),
purchases as (
select
distinct e.user_id
from trials a
inner join events e on e.user_id = a.user_id
where e.event_type = 'purchase'
)

select 'installs' as step, COUNT(*) from installs
union
select 'trials' as step, COUNT(*) from trials
union
select 'purchase' as step, COUNT(*) from purchases
order by count desc
;
...
Рейтинг: 0 / 0
22.01.2022, 11:24
    #40128661
gggg111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воронка продаж в postgres
[quot gggg111#22424621]Построить воронку продаж по странам вида: “country”, “installs”, “trials”,
“purchases”, “conversion_rate_to_trial”, “conversion_rate_to_purchase”

Ограничения: на 1 пользователя может быть только 1 оформление триала и 1 оформление purchase
Покупка возможна только по истечению платного периода.

Таблица:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DROP TABLE IF EXISTS events;
CREATE TABLE events
(
    transaction_id SERIAL PRIMARY KEY,
    datetime timestamp,
	event_type VARCHAR(255) NOT NULL,
	user_id INT NOT NULL,
	country VARCHAR(255) NOT NULL
);
INSERT INTO events (transaction_id, datetime, event_type, user_id, country) 
VALUES
(345642,'2021-01-03', 'installs', 3253, 'Russia'),
(353787,'2021-01-03', 'trial', 3253, 'Russia'),
(363568,'2021-01-10', 'purchase', 3253, 'Russia'),
(436561,'2021-01-05', 'installs', 3333, 'Russia'),
(252512,'2021-01-06', 'trial', 3333, 'Russia'),
(325368,'2021-01-13', 'purchase', 3333, 'Russia'),
(417809,'2021-01-03', 'installs', 3266, 'Brazil'),
(436556,'2021-01-14', 'installs', 3266, 'Brazil'),
(436578,'2021-01-16', 'trial', 3266, 'Brazil'),
(436800,'2021-01-23', 'purchase', 3266, 'Brazil'),
(324252,'2021-02-11', 'installs', 5555, 'Brazil'),
(124255,'2021-02-19', 'trial', 5555, 'Brazil'),
(124215,'2021-02-16', 'trial', 2546, 'Brazil'),
(124152,'2021-02-16', 'installs', 2546, 'Brazil')




Здесь рассчитал общее количество событий по типам:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT country,
 sum(case when event_type='trial' then 1 else 0 end) as trial,
 sum(case when event_type='installs' then 1 else 0 end) as installs,
 sum(case when event_type='purchase' then 1 else 0 end) as purchase
FROM events
GROUP BY country;




Но нужно еще учесть, то что загрузок может быть несколько. Т.е установил один раз, удалил, установил второй раз. Только после этого второй установки взял пробный период и только после него возможна покупка.
Пока не пойму как это реализовать.
...
Рейтинг: 0 / 0
23.01.2022, 10:12
    #40128764
Воронка продаж в postgres
gggg111
2021-01-03

это не datetime, а date
gggg111
(353787,'2021-01-03', 'trial', 3253, 'Russia'),

'trial' - должен быть в виде цифры, а само слово - в словаре
gggg111
Но нужно еще учесть, то что загрузок может быть несколько. Т.е установил один раз, удалил, установил второй раз.

ну и что, триал то 1
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Воронка продаж в postgres / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]