为啥要在 group by 子句中使用 substr?
Posted
技术标签:
【中文标题】为啥要在 group by 子句中使用 substr?【英文标题】:Is there any why to use substr in group by clause?为什么要在 group by 子句中使用 substr? 【发布时间】:2016-01-13 05:30:14 【问题描述】:我有一个表 T 和该表 C 中的一列,此列 C 是两个字符串(例如,国家、城市)的组合,现在我想获取特定国家/地区的总条目数。如下所示
select count(*), country from T group by substr(country, 0, 20);
如何做到这一点?
【问题讨论】:
回答我这个。假设您有 2 个country
值,country1234567890123 city1
和 country1234567890123 city2
。现在在输出中,您需要将 country1234567890123
计数为 2。但是您还需要显示 country1234567890123 city1
或 country1234567890123 city2
吗?如果是,那是哪一个?
是否可以显示 country1234567890123 city1 -1 country1234567890123 city2- 1 其中 1 是计数?我不这么认为。 Tim 的内部查询给出了 country1234567890123 - 2
Tim 的内部查询为您提供了您在问题中要求的结果。所以distinct(substr(country, 0, 20))
将是2
。如果您只想显示country
的计数,那么您为什么要首先使用substr(country, 0, 20)
分组。没有意义。
试试这个。在sqlfiddle.com 中重新创建一些示例数据,并根据这些数据显示您期望的确切输出。
【参考方案1】:
您可以在JOIN
T
表中查询您原始问题中country
字段的子字符串:
select t1.cntCount, t2.country
from
(
select count(*) as cntCount, substr(country, 0, 20) as cntSub
from T
group by substr(country, 0, 20)
) t1
left join
country t2
on t1.cntSub = substr(t2.country, 0, 20)
【讨论】:
由于表很大,我无法进行连接。 我的答案中的第一个子查询与您所拥有的没有太大不同,我不认为执行LEFT JOIN
会招致太多的惩罚。你有没有设置任何索引?为什么你不能加入?
现在我想起来了,你的第一个子查询足以给出答案。我的答案现在没有实际意义:)【参考方案2】:
试试这个
select distinct(derived_country),count(*) as countOfCountry from
(select T.*,substr(country, 0, 20) as derived_country from T) d
group by derived_country
【讨论】:
这个查询非常聪明,但它不会返回country
字段的子字符串版本而不是全名吗?
是的,我同意你的看法。但是如果substr(country,0,20)
与2个country
相同,但country
的实际值不同,在这种情况下,我们不能通过输出在一个组中显示country
的值。如果我们按country
分组,它违背了 OP 要求的逻辑。无论如何,我们可以使用聚合函数来显示不同国家(派生国家)列表中的任何一个。
不错的收获。具有讽刺意味的是,我的查询也处理了这种情况,重复的子字符串将被分组。
(赞成,谢谢,这个例子帮助了我)。这是孤立的d
错字吗?以上是关于为啥要在 group by 子句中使用 substr?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 pyspark sql 不能正确计算 group by 子句?
为啥没有聚合函数的选择列需要成为 MySQL 中 Group by 子句的一部分?
为啥包含 group by、sum 或 where 子句时这条 SQL 语句会挂起?