我想获得我的数据集的统计数据,
例如,这是我的数据集:FirstName LastName Country City BirthMonth
Donald Trump England London Jan
Bill Gates England London Sep
Donald Suther England York Sep
Donald Suther Germany Berlin Jan
这是我的'group_by'列表:
[['FirstName', 'LastName'], ['Country', 'City'], ['BirthMonth']]
我想要得到以下统计数据:
group by FirstName &姓:
FirstName LastName Count
Donald Trump 1
Donald Suther 2
Bill Gates 1
按国家&城市:
Country City Count
England London 2
England York 1
Germany Berlin 1
group by BirthMonth:
BirthMonth Count
Jan 2
Sep 2
我的查询看起来像这样:
select FirstName, LastName, Country, City, BirthMonth
from my_table
where <some conditions to filter rows only from certain timestamp>
现在我有两个选项:
。将所有值返回到服务器并在那里进行处理(我使用python) -此查询包含许多行并导致开销
b。查询多次,每次按特定字段分组
select FirstName, LastName, count(*) as group_by
from my_table
where ...
group by FirstName, LastName
c。是否有第三种选择,即只有一个查询,并返回所有不同的"group_by"?
和另一个问题:
从(a)和(b)哪个更好?
我要注意到组by有有限的选项-例如'FirstName'只有20个选项,这意味着(b)将每次结果小于20*(组by在查询行的数量)<40,但是(a)将产生20^5行,这是大量的数据
为了简化,我假设每次在group_by
中不超过2列,(这实际上是目前的情况,它可能在未来增长,但目前我可以使用一个解决方案,考虑到这一点)
您可以使用UNION
将每个分组查询与其他查询组合起来。
NULL
填充每个子查询中未使用的列。SELECT FirstName, LastName, NULL AS Country, NULL AS City, NULL AS BirthMonth, COUNT(*) AS count
FROM my_table
GROUP BY FirstName, LastName
UNION ALL
SELECT NULL, NULL, Country, City, NULL, COUNT(*)
FROM my_table
GROUP BY Country, City
UNION ALL
SELECT NULL, NULL, NULL, NULL, BirthMonth, COUNT(*)
FROM my_table
GROUP BY BirthMonth