mysql - 如何按文本的第一个字母分组

标签 mysql sql

我在 MySQL 中有以下查询:

select val,count(val)
from ....
where ...
group by val

它给出:

val   count
CE3    4
CE5    1
A3     12
BRICK4  5
BRICK2  2

我只想显示每个首字母计数最高的行。 这意味着所有以 A 开头的 val 都是一组,所有以 B 开头的 val 是另一组等等。 .

预期的结果是:

val   count
CE3    4     /  CE3  CE5  are in group C , CE3 has higher count
A3     12    /  A3 is the only one in group A
BRICK4  5    / BRICK4  BRICK2  are in group B, BRICK4   has higher count

我该怎么做?

编辑: 我想做的是在查询中创建一个临时列,它将代表该组,例如:

val   count  group
CE3    4      C
CE5    1      C
A3     12     A
BRICK4  5     B
BRICK2  2     B

然后搜索每组计数值最高的行。 但我不确定这是最好的方法

最佳答案

尝试这样的事情:

select
    val
    ,MAX(count) as count
    ,left(val,1) as first_letter
from (
    select
        val
        ,count(val) as count
    from tbl
    group by val
) a
group by left(val, 1);

首先获取每个 valcount 并从该结果中获取按首字母分组的 MAXcount

更新:(感谢 Vamsi Prabhala 指出我的第一个解决方案不是最好的)

在获得每个 valcount 之后,我使用一个变量重做 ROW_NUMBER() 功能(来自 MS-SQL)并选择结果的第一行,按 first_lettercount desc

排序
select val, count, first_letter from (
  select
     @i:=CASE
          WHEN @first_letter = first_letter THEN @i + 1
          ELSE 1
     END as rn
     ,@first_letter:= a.first_letter as First_letter
     ,a.val
     ,a.count
  from (
      select
          val
          ,count(val) as count
          ,left(val,1) as first_letter
      from tbl
      group by val
  )a, (select @i:=0) b
  order by First_letter, count desc
  ) c
where rn = 1

关于mysql - 如何按文本的第一个字母分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908181/

相关文章:

java - 如何在 Spring 数据中获取嵌套对象的大小

更新后,MySQL 服务器将无法使用 'mysqld' 从终端启动

php - 统计文章中的评论数

php - 无法将数据插入多个数据库 Codeigniter(MongoDB 和 MySQL)

mysql - 在MySQL中使用动态SQL(带有查询结果的子查询)

mysql - SQL 计数不同的行

sql - sed:改变反引号内文本的大小写

mysql - 将唯一列的多行组合成单行

mysql - 为什么我的 CREATE TABLE 语句没有反引号就不能运行?

mysql - SQL 需要有关请求的帮助