Нужна помощь в реализации First Week Retention на MongoDB + REDASH

Имеем БД (одну таблицу) с ивентами для аналитики

Анализируем игру(если это важно)

Нужно получить данные о том, сколько игроков возвращается в игру на Х день после первого входа и процент - (сколько зашло на Х день)/(сколько новых зашло в день 0)

Для этих вычислений нам достаточно трёх полей:

Registered - unixtime время первого входа в игру - передаётся во всех последующих ивентах, не меняется для одного юзера, как и его PlayerId, это наш Day0

DateTime - unixtime время отправки любого ивента - даёт нам понять, когда ещё, кроме нулевого дня игрок входил в игру

PlayerId - уникальный идентификатор игрока(нам нужны уникальные пользователи)

В идеале, таблица должна иметь такой вид: Retention first week

На данный момент моих познаний хватило на такое:

{
    "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"
                        }
                    ]
                }
            }
        }
    ]
}

Результат:

результат квери таблицей Имеющийся результат

Нужно собрать это в обычную таблицу, а не в пивотную( как создать новые поля - знаю, запутался в перераспределение данных в новые столбцы) и добавить вычисление процента игроков


Ответы (0 шт):