Нужна помощь в реализации First Week Retention на MongoDB + REDASH
Имеем БД (одну таблицу) с ивентами для аналитики
Анализируем игру(если это важно)
Нужно получить данные о том, сколько игроков возвращается в игру на Х день после первого входа и процент - (сколько зашло на Х день)/(сколько новых зашло в день 0)
Для этих вычислений нам достаточно трёх полей:
Registered - unixtime время первого входа в игру - передаётся во всех последующих ивентах, не меняется для одного юзера, как и его PlayerId, это наш Day0
DateTime - unixtime время отправки любого ивента - даёт нам понять, когда ещё, кроме нулевого дня игрок входил в игру
PlayerId - уникальный идентификатор игрока(нам нужны уникальные пользователи)
В идеале, таблица должна иметь такой вид:

На данный момент моих познаний хватило на такое:
{
"collection": "dance",
"aggregate": [
{
"$match": {
"$and": [
{
//---Здесь мы отфильтровываем - за какой период хотим видеть ретеншн
//---это формирует список Day0 - для каждого из которых будет сформирован список его R_Day1 - R_Day7
"Registered": {
"$lt": "ISODate(\"{{Finish date}}\")"
}
},
{
"Registered": {
"$gt": "ISODate(\"{{Start date}}\")"
}
},
{
//---Ну и отфильтровываем только ивенты старта сессии - чтобы посчитать только входы в игру
"EventType": "Session Start"
}
]
}
},
{
"$group": {
"_id": {
"DayZero": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$Registered"
}
},
"DayActive": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$DateTime"
}
},
"PlayerId": "$PlayerId"
}
}
},
{
"$group": {
"_id": {
"DayZero": "$_id.DayZero",
"DayActive": "$_id.DayActive"
},
"Ret": {
"$sum": 1
}
}
},
{
"$project": {
"_id": "1",
"DayZero": {
"$dateFromString": {
"dateString": "$_id.DayZero"
}
},
"DayActive": {
"$dateFromString": {
"dateString": "$_id.DayActive"
}
},
"Ret": 1
}
},
{
"$project": {
"Days": {
"$divide": [
{
"$subtract": [
"$DayActive",
"$DayZero"
]
},
86400000
]
},
"DayZero": {
"$dateToParts": {
"date": "$DayZero",
"timezone": "+02:00"
}
},
"Ret": 1
}
},
{
"$project": {
"Ret": 1,
"Days": 1,
"DayZero": {
"$concat": [
{
"$toString": "$DayZero.day"
},
".",
{
"$toString": "$DayZero.month"
},
".",
{
"$toString": "$DayZero.year"
}
]
}
}
}
]
}
Результат:
Нужно собрать это в обычную таблицу, а не в пивотную( как создать новые поля - знаю, запутался в перераспределение данных в новые столбцы) и добавить вычисление процента игроков

