Как бороться с несколькими перекрывающимися наборами данных? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть набор данных, который структурирован так:

[user_id, title, country, platform, language]
[100, 'Title A', 'US', 'Windows', 'English']
[100, 'Title A', 'US', 'Android', 'English']
[200, 'Title C', 'FR', 'Windows', 'French']
[300, 'Title B', 'US', 'Windows', 'English']
And so on...

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

ЕслиЯ должен был написать запрос:

SELECT
title
, country
, platform
, language
count(distinct user_id)
FROM table
GROUP BY 1
, 2
, 3
, 4

Получившаяся таблица выглядела бы так:

[title, country, platform, language, unique_count]
['Title A', 'US', 'Windows', 'English', 10,000]
['Title A', 'US', 'Android', 'English', 7,000]
['Title C', 'FR', 'Windows', 'France', 4,000]
['Title B', 'US', 'Windows', 'English', 8,000]
And so on...

Если бы я должен был изолировать отдельные измерения, было бы перекрытие, так как пользователь может быть в несколькихкатегории.

Как я могу структурировать данные таким образом, чтобы строки были инклюзивными и могли быть сведены в таблицу, например, на информационной панели?

Если было только две категории, это кажется более простой проблемойпоскольку данные могут быть отформатированы как куб:

        | Windows | Android |
--------+---------+---------+----
Title A | 10,000  |  7,000  | 17,000
--------+---------+---------+----
Title B |  8,000  |  11,000 | 19,000
--------+---------+---------+----
        | 19,000  | 18,000  |

Существует ли что-то вроде n-мерной структуры, которая может включать все измерения?

Другая проблема заключается в том, что данные должны быть агрегированы и не могут быть просто развернуты, поскольку они слишком велики для размещения в памяти.

1 Ответ

1 голос
/ 05 апреля 2019

Если вам нужны все комбинации, тогда используйте with cube:

SELECT title, country, platform, language,
       count(unique user_id)
FROM table
GROUP BY title, country, platform, language with cube;

Чаще я предпочитаю GROUPING SETS.Например, чтобы получить все пары:

SELECT title, country, platform, language,
       count(unique user_id)
FROM table
GROUP BY ( (title, country),
           (title, platform),
           (title, language),
           (country, platform),
           (country, language),
           (platform, language)
         );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...