【问题标题】:mysql various group by in one querymysql 在一个查询中进行各种分组
【发布时间】: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


【解决方案1】:

您可以使用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

【讨论】:

  • 所以我在这里做三个查询并合并,我想更好的方法是使用一个名为查询的子
  • 正如我在评论中所说的,他们唯一真正的方法是通过基准来判断什么是最好的。
  • 我怀疑这和做 3 个单独的查询会有很大的不同。并且处理结果会更容易,因为您不必弄清楚每行在哪个子组中。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2011-03-20
  • 2018-02-25
  • 2013-11-29
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多