【问题标题】:Find the most frequent value ignoring everything after '(' within it查找最常见的值,忽略“(”之后的所有内容
【发布时间】:2017-02-09 16:18:08
【问题描述】:

我试图找到最常见的字符串,忽略其中( 之后的所有内容。

那么,它应该如何工作。如果我有字符串:

England (88)
Iceland (100) 
Iceland (77) 
England (88)
Denmark (15) 
Iceland (18)

它应该返回

Iceland

因为它是这里出现频率最高的国家,而且不管英格兰(88 岁)将假装成一个字符串。

不幸的是,我的查询返回

England(88)

SQLfiddle

我一直在考虑分两步:

  1. 截断每个国家/地区字符串
  2. 做我已经写好的脚本。

但我第一步失败了。

【问题讨论】:

  • 很抱歉,但所有答案在 Android 中都不起作用:android.database.sqlite.SQLiteException:没有这样的功能:INSTR
  • 哇,精简的android版本相当有限。

标签: sql sqlite android-sqlite


【解决方案1】:

SQL Fiddle 正在运行,因此无法测试,但我认为您可以使用 SUBSTR()INSTR() 来隔离第一个 ( 的左侧部分:

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;

编辑:在https://sqliteonline.com/ 上测试,它按预期返回IcelandFiddle

【讨论】:

  • 非常感谢,但它在 Android 中不起作用,因为 Android SQLite 没有 INSTR 功能:(
  • 你使用的是什么版本的 SQLite?
  • 所以基本的 SQLite 从 3.7.15 开始就有了,但我猜 Android 版本已经被剥离了,没有 Regex,没有 INSTR()。猜猜您必须在数据库之外执行此操作。
  • 谢谢。我可以做这个。只需要更改我的 SQLite 表。
  • @Иван 那会很理想,将国家/地区存储在一个单独的字段中是更好的设计,并且可以让很多事情变得更容易。
【解决方案2】:

这是一堆字符串操作,在 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));

【讨论】:

    【解决方案3】:

    无论您的文本中是否包含'(',这都是一个防弹工具

    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
    

    【讨论】:

    • 可以没有'instr',因为我在Android中没有它
    【解决方案4】:

    请尝试以下基于replacertrim并可能复制

    的解决方案
    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
    ;
    

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2011-07-19
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2018-09-17
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多