如何按第一个字母分组

avi*_*avi 3 mysql sql

我在MySQL中有以下查询:

select val,count(val)
from ....
where ...
group by val
Run Code Online (Sandbox Code Playgroud)

它给:

val   count
CE3    4
CE5    1
A3     12
BRICK4  5
BRICK2  2
Run Code Online (Sandbox Code Playgroud)

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

预期的结果是:

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

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

val   count  group
CE3    4      C
CE5    1      C
A3     12     A
BRICK4  5     B
BRICK2  2     B
Run Code Online (Sandbox Code Playgroud)

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

Val*_*ica 6

尝试这样的事情:

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);
Run Code Online (Sandbox Code Playgroud)

首先得到count每个val和从这个结果得到MAX第一个字母的计数分组

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

获得countper之后val,我使用一个变量来重做ROW_NUMBER()功能(来自MS-SQL)并从结果中选择第一行,按顺序排序first_lettercountdesc


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
Run Code Online (Sandbox Code Playgroud)