为啥要在 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 city1country1234567890123 city2。现在在输出中,您需要将 country1234567890123 计数为 2。但是您还需要显示 country1234567890123 city1country1234567890123 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】:

您可以在JOINT 表中查询您原始问题中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 语句会挂起?

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

为啥一个 group by 的聚合这么慢?

group by后接的having语句怎样使用才是有效的,我为啥不行的