首页 > 解决方案 > 如何在下表中找到对

问题描述

查找出现在同一文档 id 中的所有频繁词对,并报告该对出现的文档数。按频率降序报告这些对。

+-------+-----+-----+---------+
|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

标签: sql-serverdatabase

解决方案


您在自联接方面走在了正确的轨道上,但联接逻辑需要稍作更改。连接条件应该是第一个单词在字典上小于第二个单词。这确保不会重复计算对。此外,文档 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;

在此处输入图像描述

演示


推荐阅读