SQL 每个 ID 的服务器词频
SQL Server Word Frequency for Each ID
我有一个 SQL 服务器 table,它有一个 ID 和一个大小约为 15,000 字的文本列。对于每个 ID,我想 return 一个包含每个唯一单词及其出现次数的列表。
CREATE TABLE MyComments (
Textid char(20) NOT NULL,
Comments VARCHAR(MAX)
)
Answer would look like
TextID Word WordCount
------- ------ ----------
1 cost 5
1 expense 7
2 cost 12
2 revenue 11
..
这并不是 SQL 服务器的设计目的;对于很大的 table(大量的行,像 15K 这样的超长文本,或两者兼而有之),执行此操作将非常昂贵。如果你的 table 很小:
SELECT c.Textid, Word = s.value, WordCount = COUNT(*)
FROM dbo.MyComments AS c
CROSS APPLY STRING_SPLIT(c.Comments, ' ') AS s
GROUP BY c.Textid, s.value
ORDER BY Textid;
在规模上,这个查询会很糟糕。
与 @lptr pointed out 一样,在大规模情况下可能会更好地以更复杂的方式重新排列此查询,以便拆分与其余逻辑分开:
SELECT c.Textid, Word = s.value, s.WordCount
FROM dbo.MyComments AS c
CROSS APPLY
(
SELECT value = CONVERT(varchar(255), value),
WordCount = COUNT(*)
FROM STRING_SPLIT(c.Comments, ' ')
WHERE LEN(value) > 0
GROUP BY CONVERT(varchar(255), value)
) AS s
ORDER BY c.textid;
但这仍然很慢(对于 8,000 行 table,它执行了将近 600,000 次读取并花费了大约 15 秒)。我不相信 SQL 服务器是做这项工作的地方。
我有一个 SQL 服务器 table,它有一个 ID 和一个大小约为 15,000 字的文本列。对于每个 ID,我想 return 一个包含每个唯一单词及其出现次数的列表。
CREATE TABLE MyComments (
Textid char(20) NOT NULL,
Comments VARCHAR(MAX)
)
Answer would look like
TextID Word WordCount
------- ------ ----------
1 cost 5
1 expense 7
2 cost 12
2 revenue 11
..
这并不是 SQL 服务器的设计目的;对于很大的 table(大量的行,像 15K 这样的超长文本,或两者兼而有之),执行此操作将非常昂贵。如果你的 table 很小:
SELECT c.Textid, Word = s.value, WordCount = COUNT(*)
FROM dbo.MyComments AS c
CROSS APPLY STRING_SPLIT(c.Comments, ' ') AS s
GROUP BY c.Textid, s.value
ORDER BY Textid;
在规模上,这个查询会很糟糕。
与 @lptr pointed out 一样,在大规模情况下可能会更好地以更复杂的方式重新排列此查询,以便拆分与其余逻辑分开:
SELECT c.Textid, Word = s.value, s.WordCount
FROM dbo.MyComments AS c
CROSS APPLY
(
SELECT value = CONVERT(varchar(255), value),
WordCount = COUNT(*)
FROM STRING_SPLIT(c.Comments, ' ')
WHERE LEN(value) > 0
GROUP BY CONVERT(varchar(255), value)
) AS s
ORDER BY c.textid;
但这仍然很慢(对于 8,000 行 table,它执行了将近 600,000 次读取并花费了大约 15 秒)。我不相信 SQL 服务器是做这项工作的地方。