我有一个包含数千个关键字的表。我想隔离该表中排名前25位的否定关键词,然后从这些排名前的关键词中创建一个连接,以查找与另一个表中这些关键词链接的句子。最终结果将是id_file
、sentence_id
、sentiment
、sentence
、token
。两个表都有标记。
令牌表(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 TOP
和INNER 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