2016-07-27 15 views
0

Ich habe eine Tabelle mit Tausenden von Schlüsselwörtern. Ich möchte die Top 25 der ausschließenden Keywords in dieser Tabelle isolieren und dann aus diesen Top-Keywords eine Verknüpfung erstellen, um die Sätze zu finden, die mit diesen Keywords in einer anderen Tabelle verknüpft sind. Das Endergebnis wird id_file, sentence_id, sentiment, sentence, token sein. Beide Tabellen haben die Token.SQL Server Wählen Sie die höchsten Datensätze aus einer Tabelle in einer anderen Tabelle

der Tokentabelle (tbl_token) hat die folgenden Spalten:

id_file, sentence_id, sentiment, token 

Die Filter die Oberseite 25 von tbl_token zu isolieren, sind wie folgt:

id_file = 3, sentiment = 'negative' 

Die Satztabelle (tbl_sentence) den folgende Spalten:

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

Die sentence_id in beiden Tabellen haben eine Eins-zu-viele-Beziehung, so dass ein Join auf diesen die Sätze herauszieht. Die Token von der obersten Abfrage existieren in tbl_sentence.

Meine aktuelle Lösung ist es, zuerst eine Top 25 von tbl_token für die gleichen Filter wie oben, Zähler zählen, sortieren Sie es in absteigender Reihenfolge.

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 

Dann verknüpfe ich, dass auf alle Tokens in einer Ansicht, die die sentence_id hat. Dann kann ich sentence_id von der Ansicht zu tbl_sentence verknüpfen, um die Sätze basierend auf den oberen 25 ausschließenden Schlüsselwörtern zu isolieren.

Dies funktioniert, aber ich frage mich nur, ob dies in einer gespeicherten Prozedur durchgeführt werden kann.

+0

zeigen nur das Ergebnis, das Sie want..thanks –

Antwort

0

Dies ist eine einfache Abfrage mit einem SELECT TOP mit einem INNER JOIN. Hast du JOINS recherchiert? Sind Sie sicher, dass Sie nicht eins zu viele meinen? Wenn das Token in mehreren Sätzen angezeigt wird, erhalten Sie nur die ersten 25 Ergebnisse, die Sie angegeben haben, und nicht mehrere Übereinstimmungen der obersten 25 Token. Die ORDER BY ist relativ wichtig, da die TOP 25 nicht immer in einer vorhersehbaren Reihenfolge ist, es sei denn, Sie geben eine Rangfolge an.

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 

Edited for One zu viele!

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

Normalerweise würde ich durch die Anzahl der Tokens bestellen, so würde nicht dieses Bedürfnis, eine Gruppe haben, indem sie mit einer Zählung von Token in absteigend sortiert. Das obige isoliert nicht die Top 25 Schlüsselwörter von den Tausenden. Ich habe die Top-25-Abfrage hinzugefügt, die ich heute verwende (siehe oben). – Rob

+0

Ich war verwirrt. Wenn Sie meinen, dass ein Token in mehreren Sätzen sein kann, dann müssen Sie aus einer Top-25-Unterabfrage auswählen und DANN innere Verknüpfung mit Ihrer anderen Tabelle. –

+0

Token sind in entsprechenden Spalten. Ja momentan habe ich eine Unterabfrage und dann eine Ansicht um die Sätze zu finden. Ich möchte die Ansicht loswerden, wenn möglich, Geschwindigkeit ist in Ordnung, aber ich könnte Millionen von Aufzeichnungen haben und diese Sicht könnte die Dinge verlangsamen. – Rob

Verwandte Themen