【问题标题】:Count frequencies of words separated with multiple spaces计算用多个空格分隔的单词的频率
【发布时间】:2020-04-11 11:10:15
【问题描述】:

我想计算一列中所有单词的出现次数。棘手的部分是连续的单词可能会出现很长的一段。表示中间有很多空格。

这是一个虚拟示例:

column_name

aaa bbb ccc ddd
[aaa]
bbb
bbb

到目前为止,我设法使用了以下代码

SELECT column_name, 
    SUM(LEN(column_name) - LEN(REPLACE(column_name, ' ', ''))+1) as counts
FROM 
    dbo.my_own
GROUP BY 
    column_name

代码给了我这样的感觉

column_name         counts

aaa bbb ccc ddd     1
[aaa]               1
bbb                 2

但是,我想要的输出是:

column_name         counts

aaa                 1
[aaa]               1
bbb                 3
ccc                 1
ddd                 1

【问题讨论】:

  • dbolen() 建议使用 SQL Server。你确定你使用的是 MySQL 吗?
  • 是的,你是对的,使用 SQL Server。这就是为什么这部分在标题中被删除了

标签: sql sql-server count sum


【解决方案1】:

在 SQL Server 中,您将使用 string_split():

select s.value as word, count(*)
from dbo.my_own o cross apply
     string_split(o.column_name, ' ') s
where s.value <> ''
group by s.value;

字符串操作高度依赖于数据库。大多数数据库都有一些方法可以做到这一点,但它们可能完全不同。

【讨论】:

  • 还有一件事,我正在尝试订购字数并使用group by word DESC。它的任何变化都不起作用。我不知道为什么不呢?
【解决方案2】:

首先,查看this question,了解如何将列中的单词拆分为多行。在那个问题中,单词用逗号分隔,但当然,它与空格相同。

对于您的情况,假设表tablename 带有id 和您在columnname 中的单词,其中您在列中最多有4 个单词,它看起来像这样:

SELECT
    tablename.id,
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.columnname, ' ', numbers.n), ' ', -1) columnname
FROM
    (SELECT 1 AS n UNION ALL
     SELECT 2 UNION ALL
     SELECT 3 UNION ALL
     SELECT 4) numbers
     INNER JOIN tablename
     ON LENGTH(tablename.columnname) - LENGTH(REPLACE(tablename.columnname, ' ', '')) >= numbers.n - 1
ORDER BY
    id, n

然后,你可以简单地数单词:

SELECT columnname, count(*) FROM (
    SELECT
        tablename.id,
        SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.columnname, ' ', numbers.n), ' ', -1) columnname
    FROM
        (SELECT 1 AS n UNION ALL
         SELECT 2 UNION ALL
         SELECT 3 UNION ALL
         SELECT 4) numbers
         INNER JOIN tablename
         ON LENGTH(tablename.columnname) - LENGTH(REPLACE(tablename.columnname, ' ', '')) >= numbers.n - 1
    ORDER BY
        id, n
) normalized
GROUP BY columnname

如果您的列中的单词超过 4 个,则需要相应地扩展从 numbers 中选择的内容。

编辑:哦,我迟到了,我假设是 MySQL。

【讨论】:

  • 感谢您的回复。只是出于好奇。在您的代码中,我必须知道最大单词数是多少(在虚拟示例中,我只给出了 4 个),因为我的数据库很大,老实说,我不知道那里有多少“唯一”单词。您是否认为,有一种方法可以不按照您的方式手动提供并运行代码?
  • 对于这种方法,您需要一些数字来源 1 到 substring_index 列中的最大单词数。您可以使用其他一些方法来生成一个大序列,例如:stackoverflow.com/a/39918568/401712
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2023-03-22
  • 1970-01-01
  • 2015-01-07
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多