我有一组结构如下的数据:
[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维结构?
另一个问题是数据必须聚合,不能简单地转动,因为它太大而无法放入内存中。
如果你想要所有组合,那么使用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)
);