我在 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);
首先获取每个 val
的 count
并从该结果中获取按首字母分组的 MAX
count
更新:(感谢 Vamsi Prabhala 指出我的第一个解决方案不是最好的)
在获得每个 val
的 count
之后,我使用一个变量重做 ROW_NUMBER()
功能(来自 MS-SQL)并选择结果的第一行,按 first_letter
和 count
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/