SQL Server从另一个表中的一个表选择顶部记录



我有一个包含数千个关键字的表。我想隔离该表中排名前25位的否定关键词,然后从这些排名前的关键词中创建一个连接,以查找与另一个表中这些关键词链接的句子。最终结果将是id_filesentence_idsentimentsentencetoken。两个表都有标记。

令牌表(tbl_token)具有以下列:

id_file, sentence_id, sentiment, token

将顶部25与tbl_token隔离的过滤器如下:

id_file = 3, sentiment = 'negative'

语句表(tbl_sentence)包含以下列:

id_file, sentence_id, sentiment, **sentence**, token

两个表中的sentence_id都有一对多的关系,因此它们之间的连接将拉出句子。来自顶部查询的令牌存在于tbl_sentence中。

我目前的解决方案是首先从tbl_token中运行与上面相同的过滤器的前25个,计数令牌,按降序排序。

SELECT TOP (25) 
    COUNT(token) AS Count, token
FROM
    tbl_token
GROUP BY 
    token, sentiment, id_file
HAVING     
    (sentiment = N'negative') AND (id_file = 3)
ORDER BY 
    COUNT(token) DESC

然后我将其链接到具有sentence_id的视图中的所有令牌。然后我可以将视图中的sentence_id链接到tbl_sentence,以基于前25个否定关键词来隔离句子。

这是可行的,但我只是想知道这是否可以在一个存储过程中完成。

这是一个使用SELECT TOPINNER JOIN的简单查询。你研究过JOIN吗?还有,你确定你不是指一对多吗?如果该标记出现在多个句子中,那么您将只获得指定的前25个结果,而不是前25个标记的多个匹配。ORDER BY相对重要,因为除非指定排名顺序,否则前25名并不总是按可预测的顺序排列。

SELECT TOP 25 
    ts.id_file, 
    ts.sentence_id, 
    ts.sentiment, 
    ts.sentence, 
    ts.token
FROM
  tbl_token tt 
  INNER JOIN tbl_sentence ts on ts.sentence_id=tt.sentence_id
WHERE
   tt.id_file=3
   AND
   tt.sentiment='negative'
ORDER BY
    tt.SomeFieldToRank25ByDateOrPriority

为一对多编辑

SELECT
    ts.id_file, 
    ts.sentence_id, 
    ts.sentiment, 
    ts.sentence, 
    ts.token
    SentenceCount=COUNT(*)
FROM
 ( 
    SELECT TOP 25 
        tt.sentence_id
    FROM 
        tbl_token tt 
    WHERE
       tt.id_file=3
       AND
       tt.sentiment='negative'
    ORDER BY
        tt.SomeFieldToRank25ByDateOrPriority
)AS X
INNER JOIN tbl_sentence ts on ts.sentence_id=x.sentence_id
GROUP BY
    ts.id_file, 
    ts.sentence_id, 
    ts.sentiment, 
    ts.sentence, 
    ts.token

最新更新