sql-server - 如何在下表中找到对
问题描述
查找出现在同一文档 id 中的所有频繁词对,并报告该对出现的文档数。按频率降序报告这些对。
- 请注意,不应有任何重复的条目,如 o (truck,boat) (truck,boat)
- 请注意,您不应该让同一对以相反的顺序出现两次。只应发生以下情况之一: o(卡车、船)(船、卡车)
+-------+-----+-----+---------+
|vocabId|docId|count| word|
+-------+-----+-----+---------+
| 1| 1| 1000| plane|
| 1| 3| 100| plane|
| 3| 1| 1200|motorbike|
| 3| 2| 702|motorbike|
| 3| 3| 600|motorbike|
| 5| 3| 2000| boat|
| 5| 2| 200| boat|
+-------+-----+-----+---------+
我使用了这个查询,但它给了我错误的结果
select r1.word,r2.word, count(*)
from result_T r1
JOIN result_T r2 ON r1.docId = r2.docId
and r1.word = r2.word group by r1.word, r2.word
预期输出:
boat, motorbike, 2
motorbike, plane, 2
boat, plane, 1
解决方案
您在自联接方面走在了正确的轨道上,但联接逻辑需要稍作更改。连接条件应该是第一个单词在字典上小于第二个单词。这确保不会重复计算对。此外,文档 ID 必须匹配(您已经在检查这一点)。
SELECT
r1.word,
r2.word,
COUNT(*) AS cnt
FROM result_T r1
INNER JOIN result_T r2
ON r1.word < r2.word AND
r1.docId = r2.docId
GROUP BY
r1.word,
r2.word
ORDER BY
COUNT(*) DESC;