我的数据如下:
movie_id comment
1 tom cruise is great
1 great action movie
2 got teary eyed
2 great cast
1 tom cruise is hott
我想要一个函数,根据我选择的movie_id返回评论中最常用的单词。所以如果我查询movie_id = 1,我会得到:
tom, 2
cruise, 2
is, 2
great, 2
hott, 1
action, 1
movie, 1
如果我查询movie_id = 2,我会得到:
got, 1
teary, 1
eyed, 1
great, 1
cast, 1
我看到了一些使用tsql的解决方案,但我之前从未使用过,也没有理解代码。在sqlite3中寻找一种方法。
答案 0 :(得分:2)
你可以用一个非常丑陋的查询来做到这一点。
select word, count(*) from (
select (case when instr(substr(m.comments, nums.n+1), ' ') then substr(m.comments, nums.n+1)
else substr(m.comments, nums.n+1, instr(substr(m.comments, nums.n+1), ' ') - 1)
end) as word
from (select ' '||comments as comments
from m
)m cross join
(select 1 as n union all select 2 union all select 3
) nums
where substr(m.comments, nums.n, 1) = ' ' and substr(m.comments, nums.n, 1) <> ' '
) w
group by word
order by count(*) desc
这是未经测试的。内部查询需要一个数字列表(此处仅限于3;您可以看到如何添加更多数字)。然后它检查一个单词是否从位置n + 1开始。一个单词在空格后面开始,所以我在注释的开头放了一个空格。
然后它将这个词拉出来,用于聚合目的。
答案 1 :(得分:0)
这是一个技巧,但您也可以使用SQLite的表值函数来解决此问题:
select value from (
select
'["' || replace(trim(title), '"', '') || '"]' as arr
from story limit 2500000
) e, json_each(e.arr)
请当心-您可能会注意到列中有很多字符,这些字符可能会中断JSON解析并引发JSON解析错误。
在这种情况下,您可能必须删除一些控制字符:
select value from (select
'["' || replace(replace(replace(replace(replace(replace(trim(title), '"', ''), CHAR(10), ""), CHAR(13), ''), " ", ""), "\", ""), ' ', '","')
|| '"]' as arr
from your_table limit 2500000
) e, json_each(e.arr)
为使调试更容易,您可以使用限制和偏移量的组合(例如limit 1000000 offset 2200000
)来帮助您查找问题行,然后将该字符替换为空字符串。