我正在尝试找到最频繁的字符串,忽略其中(
之后的所有内容。
那么,它应该如何运作。如果我有字符串:
England (88)
Iceland (100)
Iceland (77)
England (88)
Denmark (15)
Iceland (18)
它应该返回
Iceland
因为它是这里最常见的国家,不管是英格兰(88)会假装的字符串。
不幸的是,我的查询返回
England(88)
我一直在想通过两个步骤来做到这一点:
但是我在第一步失败了。
答案 0 :(得分:1)
这是一堆字符串操作,在SQLite中相当麻烦。这是一种方法:
select trim(substr(str, 1, instr(str, '(') - 1)) as country,
sum(cast(replace(substr(str + 1, instr(str, '('), ')', '') as int))
from t
group by trim(substr(str, 1, instr(str, '(') - 1));
答案 1 :(得分:1)
SQL Fiddle正在表现,因此无法测试,但我认为您可以使用SUBSTR()
和INSTR()
来隔离第一个{{1}的左侧部分}:
(
修改:在https://sqliteonline.com/上进行了测试,并按预期返回SELECT SUBSTR(X,1,INSTR(X,'(')-1) AS HUS
FROM tt
GROUP BY SUBSTR(X,1,INSTR(X,'(')-1)
ORDER BY COUNT(*) DESC
LIMIT 1;
:Fiddle。
答案 2 :(得分:1)
无论您的文字中是'('
还是
select rtrim(substr(mycolumn,1,instr(mycolumn || '(','(')-1))
from mytable
group by rtrim(substr(mycolumn,1,instr(mycolumn || '(','(')-1))
order by count(*) desc
limit 1
答案 3 :(得分:0)
请根据替换, rtrim 以及可能复制
尝试以下解决方案select rtrim(substr(replace(mycolumn,'(',replicate(' ',50)),1,50))
from mytable
group by rtrim(substr(replace(mycolumn,'(',replicate(' ',50)),1,50))
order by count(*) desc
limit 1
;
select rtrim(substr(replace(mycolumn,'(',' '),1,50))
from mytable
group by rtrim(substr(replace(mycolumn,'(',' '),1,50))
order by count(*) desc
limit 1
;