【发布时间】:2021-08-22 06:33:31
【问题描述】:
我想获得关于我的数据集的统计数据,
例如,这是我的数据集:
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']]
我想获得以下统计数据:
按名字和姓氏分组:
FirstName LastName Count
Donald Trump 1
Donald Suther 2
Bill Gates 1
按国家和城市分组:
Country City Count
England London 2
England York 1
Germany Berlin 1
按出生月份分组:
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>
现在我有两个选择:
a. 将所有值返回到服务器并在那里处理(我正在使用 python)- 此查询包含许多行并导致开销
b.多次查询,每次按特定字段分组
select FirstName, LastName, count(*) as group_by
from my_table
where ...
group by FirstName, LastName
c. 是否有第三种选择,即有一个查询并返回所有不同的“group_by”?
还有一个问题:
(a)和(b)哪个更好?
我会注意到 group by 的选项有限 - 例如 'FirstName' 只有 20 个选项,这意味着 (b) 每次都会导致小于 20*(查询行中 group by 的数量)
为简化起见,我假设每次 group_by 中的列不超过 2 列,
(这实际上是目前的情况,未来可能会增长,但目前我可以使用考虑到这一点的解决方案)
【问题讨论】:
-
你怎么能期望在一个查询中做到这一点?您在某些行中有不同数量的列。
-
您的意思是说
(a)将返回 20^5 行吗? -
使用数据库的一般规则是尽量在数据库中进行尽可能多的处理,以尽量减少必须发送给客户端的结果量。所以 (b) 通常是首选方式。
-
但是对于任何特定的应用程序,您应该对不同的方法进行基准测试,看看哪种方法最适合您。也许将数据提取到熊猫中并在那里进行分组(如果您使用的是 Python)。
-
基本点是通信通常比处理慢几个数量级,所以通常需要尽量减少。
标签: mysql