从 SQL 中的字符串列中获取最常用的单词

2023-11-27

所以我们有这个数据库填充了一堆字符串,在本例中是帖子标题。

我想做的是:

  1. 将字符串拆分为单词
  2. 计算单词在字符串中出现的次数
  3. 给我前 50 个单词
  4. data.se 查询中没有此超时

我尝试使用来自的信息这个问题适配data.se如下:

select word, count(*) from (
select (case when instr(substr(p.Title, nums.n+1), ' ') then substr(p.Title, nums.n+1)
             else substr(p.Title, nums.n+1, instr(substr(p.Title, nums.n+1), ' ') - 1)
        end) as word
from (select ' '||Title as string
      from Posts p
     )Posts cross join
     (select 1 as n union all select 2 union all select 10
     ) nums
where substr(p.Title, nums.n, 1) = ' ' and substr(p.Title, nums.n, 1) <> ' '
) w
group by word
order by count(*) desc

不幸的是,这给了我很多错误:

“substr”不是可识别的内置函数名称。语法不正确 靠近“|”。 “nums”附近的语法不正确。

因此,给定 SQL 中的一列字符串,每个字符串中的文本量可变,我怎样才能获得最常用的 X 个单词的列表呢?


正如 Blogbeard 所说,您提供的查询不适用于 SQL Server。这是计算最常用单词的一种方法。这是基于一个函数,定界分割N4K,由 Jeff Moden 编写并由 SQL Server Central 社区成员改进。

ONLINE DEMO

WITH E1(N) AS (
    SELECT 1 FROM (VALUES
        (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
    ) t(N)
),
E2(N) AS (SELECT 1 FROM E1 a CROSS JOIN E1 b),
E4(N) AS (SELECT 1 FROM E2 a CROSS JOIN E2 b)
SELECT TOP 50
    x.Item,
    COUNT(*)
FROM Posts p
CROSS APPLY (
    SELECT 
        ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = LTRIM(RTRIM(SUBSTRING(p.Title, l.N1, l.L1)))
        FROM (
            SELECT s.N1,
                L1 = ISNULL(NULLIF(CHARINDEX(' ',p.Title,s.N1),0)-s.N1,4000)
            FROM(
                SELECT 1 UNION ALL
                SELECT t.N+1 
                FROM(
                    SELECT TOP (ISNULL(DATALENGTH(p.Title)/2,0))
                        ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
                    FROM E4
                ) t(N)
                WHERE SUBSTRING(p.Title ,t.N,1) = ' '
            ) s(N1)
        ) l(N1, L1)
) x
WHERE x.item <> ''
GROUP BY x.Item
ORDER BY COUNT(*) DESC

由于不允许创建函数,所以我就这样编写了。如果您有兴趣,这里是函数定义:

CREATE FUNCTION [dbo].[DelimitedSplitN4K](
    @pString NVARCHAR(4000), 
    @pDelimiter NCHAR(1)
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN

WITH E1(N) AS (
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
cteTally(N) AS(
    SELECT TOP (ISNULL(DATALENGTH(@pString)/2,0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
cteStart(N1) AS (
    SELECT 1 UNION ALL 
    SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
),
cteLen(N1,L1) AS(
    SELECT s.N1,
        ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,4000)
    FROM cteStart s
)
SELECT 
    ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
    Item       = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l
;

以下是您将如何使用它:

SELECT TOP 50
    x.Item,
    COUNT(*)
FROM Posts p
CROSS APPLY dbo.DelimitedSplitN4K(p.Title, ' ') x
WHERE LTRIM(RTRIM(x.Item)) <> ''
GROUP BY x.Item
ORDER BY COUNT(*) DESC

结果:

Item             
-------- ------- 
to       3812411 
in       3331522 
a        2543636 
How      1770915 
the      1534298 
with     1341632 
of       1297468 
and      1166664 
on       970554  
from     964449  
for      886007  
not      835979  
is       704724  
using    703007  
I        633838  
-        632441  
an       548450  
when     449169  
file     409717  
how      358745  
data     335271  
do       323854  
can      310298  
get      305922  
or       266317  
error    263563  
use      258408  
value    254392  
it       251254  
my       238902  
function 235832  
by       231025  
Android  228308  
as       216654  
array    209157  
working  207445  
does     207274  
Is       205613  
multiple 203336  
that     197826  
Why      196979  
into     196591  
after    192056  
string   189053  
PHP      187018  
one      182360  
class    179965  
if       179590  
text     174878  
table    169393  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 SQL 中的字符串列中获取最常用的单词 的相关文章

  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 在 Sql Server 中转换为日期时间 MM/dd/yyyy HH:mm:ss

    如何将给定的日期格式转换为MM dd yyyy HH mm ss 我尝试了下面这个但没有实现 谁能帮我 SELECT CONVERT VARCHAR 20 GETDATE 120 SQL Server 2005及以上版本支持 SELECT
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 当所有维度值都具有 100% 重要性时处理多对多维度

    我至少会尽力保持简洁 假设我们正在跟踪一段时间内的账户余额 所以我们的事实表将包含诸如 账户余额情况表 FK 账户ID FK 日期ID Balance 显然你有一个账户维度表 and a 日期维度表 所以现在我们可以轻松地过滤帐户或日期 或
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • Visual Studio 2010 中的数据库设计器

    我需要创建一个全新的 Sql Server 2008 数据库 并希望使用 Visual Studio 2010 Ultimate 中的数据库项目 我已经创建了该项目并在下面添加了一个表格dbo架构 桌子 sql仅以纯文本形式显示 但带有颜色
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p

随机推荐

  • 多个具有 c3p0 配置的应用程序发出警告

    Hi我在一个tomcat下有两个Web应用程序 两者都使用 hibernate 3 2 1 和 c3p0 0 9 1 2 当部署第二个应用程序时 我总是收到以下警告消息 雄猫 阿帕奇 tomcat 6 0 28 警告 2010 11 06
  • 如何同步表单身份验证 cookie 和 Asp.Net 会话的生命周期?

    我正在构建一个 ASP NET 网站 该网站使用FormsAuthentication以及一个标准会话机制 其配置如下
  • 将大文本文件读入 Textview

    我想将大文件从 SD 卡读取到文本视图中 我有想法 但不知道如何申请 我认为这个东西需要使用 处理程序和 线 但我不知道如何申请 任何人都可以给出一些例子或教程 Updated Thread test new Thread public v
  • @Document indexName 中使用 Spring Data Elasticsearch 和 Spring Boot 的 SpEL 未被解析

    寻求使用内部 SpEL 的帮助 Document注释参考 spring data elasticsearch 3 2 3 RELEASE和弹簧靴2 2 1 RELEASE 我在谷歌搜索上遇到了这个问题的帮助 因为关键字出现了不相关的问题 我
  • 使用 Reporting Services (SSRS) 作为 ASP.NET Core 站点中的参考

    我花了几天时间努力寻找解决方案 所以我想分享我的情况 我正在将现有的 ASP NET MVC 应用程序转换为 ASP NET Core MVC 然而 使用 ASP NET Core 的最大变化是System Web命名空间是不行的 然而 通
  • 如何提高室内定位精度?

    我应该为某个地方开发一个室内定位系统 所以我开始收集有关如何开发这样一个系统的信息 我现在的问题是 什么控制着定位的准确性以及如何提高它 我发现了不同精度的API和项目 例如 ericsson室内定位API提供了10米以内的精度 而Qubu
  • 为 Windows 编写控制台样式应用程序的好资源吗?

    对于某些程序来说 没有什么比命令行更好的了 不幸的是 我从未见过关于如何编写超越 Hello World 的控制台应用程序的良好文档或示例 我有兴趣制作控制台应用程序 例如Vim or Emacs 嗯 与 Vim 或 Emacs 不完全一样
  • 将 0 int 文字发送到 const 字符串参数时发生访问冲突

    在 VS2015 和 VS2017 上 编译时不会发出警告 并生成无法捕获的访问冲突并使应用程序崩溃 显然 int 0 会默默地转换为空指针 然后假定该指针指向字符串 从而崩溃 include
  • ASP.NET 5 (vNext) Web 项目:从 beta4 升级到 beta6 的库冲突

    我升级了 DNVMdnvm upgrade Unstable 跑步dnvm list显示此版本处于活动状态 1 0 0 beta6 12120 我使用 ASP NET 5 网站预览模板创建了一个新项目 并验证了它是否可以构建 我更改了pro
  • 参考 - 这个正则表达式是什么意思?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 这是什么 这是常见问答集 这也是一个社区Wiki 所以邀请大家参与维护 为什么是这样 regex正在遭受给我 ze 代码问题类型和没有解释的糟糕答案 此参考旨在
  • iOS 模拟器不适用于 https,所有 https 均被评估为不可信

    模拟器版本 10 0 SimulatorApp 835 2 1 Xcode版本是9 1 似乎所有的https连接被评估为不被信任 Xcode和模拟器升级后受影响 我确信 https 连接也具有有效的证书 因为同样https support
  • 为什么不允许 nameof(object) ?

    在 C 6 0 中你可以这样写 var instance default object var type typeof object 他们有相同的结果 var instance default System Object var type
  • 从Unity到iOS,如何完美自动化框架、设置和plist?

    在 Unity3D 中构建 iOS Xcode 项目时 如何完美自动化这三个 构架 设置 plist 项目 解决方案必须仅具有最现代的 2019 语法和变体 因为多年来 Unity 中的语法和变体略有变化 重要的 非常不幸的是你可以not正
  • CodeIgniter 的 HMVC 模块化扩展出现问题

    我一直在使用 PHP 5 3 CodeIgniter 2 0 和 HMVC 模块化扩展在 MacOS X Snow Leopard 上进行本地开发 一切都进展顺利 突然 我无法查明原因 在尝试打开页面时偶尔会遇到此错误 无法选择指定的 数据
  • 我无法在我的 Google Drive 中使用 php 查看通过 api 创建的文件和文件夹

    我正在尝试使用 google Drive api 创建文件夹 我能够在最后获取文件 ID 但我无法访问谷歌驱动器中的文件夹 似乎有一些权限问题 scopes array https www googleapis com auth drive
  • 如何在 R 绘图上的文本中包含上标?

    我需要它看起来像这样 R 2 一些值 我尝试了下面的代码 但它不起作用 它显示为 R 表达式 2 一些值 text 25 200 paste R expression 2 round rsquarelm2 2 你不需要一个字符向量 而是一个
  • 使用旧版本的节点创建 React App

    我正在尝试使用创建反应应用程序但出现了它需要的错误Node 10或更高 我的节点版本是节点8 10 0而且我无法更新 Node 版本 因为它是一台工作机器 有没有办法运行旧版本的 Create React App 来与我的旧 Node 版本
  • JPA - @PreRemove 方法行为

    我有 2 个具有多对多关系的实体 Movie 实体是此关系的所有者 因此当我想要删除 Actor 实体时 我使用注释为 PreRemove 的方法来删除 Movie 演员表中出现的任何 Actor ID 以避免 外键违规异常 电影课 Ent
  • 展平双重嵌套 JSON

    我正在尝试展平一个如下所示的 JSON 文件 teams teamname 1 members firstname John lastname Doe orgname Anon phone 916 555 1234 mobile email
  • 从 SQL 中的字符串列中获取最常用的单词

    所以我们有这个数据库填充了一堆字符串 在本例中是帖子标题 我想做的是 将字符串拆分为单词 计算单词在字符串中出现的次数 给我前 50 个单词 data se 查询中没有此超时 我尝试使用来自的信息这个问题适配data se如下 select