SQLServer count () über () mit distinct

9

Ich arbeite an einem Projekt, bei dem wir die Anzahl der einzelnen Zeilen zählen müssen. Eine vereinfachte Version des Szenarios enthält eine user -Tabelle, eine keyword -Tabelle und eine keyword_user -Tabelle.

Die Tabelle user enthält nur allgemeine Benutzermetadaten, wie Name usw. Die anderen Tabellen sind unten aufgeführt.

Schlüsselwortbenutzer:

%Vor%


    Stichwort:

%Vor%

Was ich tun möchte, ist, eine maximale Anzahl von Benutzern (5) auf der Basis der Benutzer keyword_id's zu finden, während auch die Gesamtzahl der übereinstimmenden Zeilen gezählt wird. Die Zählung muss eindeutig sein.

Die Abfrage:

%Vor%

Ergebnismenge:

%Vor%


PROBLEM:

Das Problem ist hier, dass Michael zweimal gezählt wird, und die Gesamtanzahl ist daher 3, wenn ich möchte, dass es 2 ist. Wenn count() over() verwendet wird, kann man keinen Ausdruck darin analysieren, der distinct enthält. Auch, wenn ich nur SELECT DISTINCT , meine Ergebnismenge sieht gut aus, neben der Gesamtzahl, die immer noch 3 wäre.

Wenn ich weitere Informationen hinzufügen muss, um die Frage zu unterstützen, lassen Sie es mich bitte wissen, und ich werde versuchen, so gut ich kann zu antworten.

MSSQL CREATE DB SCRIPT (SAMPLE DATEN)

example_data.sql

gewünschter Ergebnissatz:

%Vor%     
Thomas Teilmann 16.10.2015, 08:00
quelle

4 Antworten

1

Sie sollten wirklich erklären, was Sie in der Frage brauchen, nicht in Kommentaren.

In CTE_Users finden wir alle eindeutigen Benutzer für die angegebenen Schlüsselwörter. Fügen Sie dann das Ergebnis mit user hinzu, um Benutzerdetails zu erhalten. Zumindest erzeugt es das Ergebnis, das Sie mit den gegebenen kleinen Beispieldaten erwarten.

%Vor%     
Vladimir Baranov 16.10.2015, 10:12
quelle
1

Ich bin ein wenig verwirrt in Ihrem Fall speziell mit den "Schlüsselwörtern" und wie sie pro Benutzer verwandt sind (dies ist nur ein Prozessproblem für mich) so fand ich eine äußere Gruppe, indem Sie Ihre erste Abfrage als meine Quellentabelle.

Bitte kommentieren Sie unten, damit wir dies verbessern können.

%Vor%

EDIT: Wir hatten wirklich eine Verwirrung dort, dann habe ich ein einfacheres Skript erstellt, das die Schlüsselwörter ausschließen soll, nur die eindeutigen Benutzer (um die Gesamtmenge zu generieren) und die obersten fünf davon (zufällige Reihenfolge).

%Vor%

Danke

BEARBEITEN: Ihr Szenario ist eine direkte "Suche nach Schlüsselwörtern", die mit einer Entität verknüpft ist, mit einer Gesamtanzahl und einem Top-5-Ergebnis. So wie ich den CTE verstehe (und auf MSDN basiert), CTE ist eine großartige Lösung für das hierarchische Data Mining (es ist nicht nötig, das zu tun und was auch immer Back-Flip zu machen, um Ihre Organisationshierarchie zu bekommen), was nicht wirklich zu dem Szenario passt, das wir hier haben.

    
ken lacoste 16.10.2015 08:39
quelle
0

Versuchen Sie Folgendes: Ich habe zwei temporäre Tabellen erstellt ( #user und #user_key ) und sie füllen.

%Vor%

Die Extraktabfrage:

Ich verwende als Haupttabelle #user , also füge ich eine Unterabfrage über die Gesamtzählung hinzu, aber in der order by-Klausel versuche ich, die Benutzer nach ihren Schlüsselwörtern zu sortieren. Sie können weitere Bedingungen hinzufügen (als Ihr In / NOT IN)

%Vor%

Gehen Sie zu SqlFiddle

BEARBEITEN

Wollen Sie das?:

%Vor%

oder das?

%Vor%     
Joe Taras 16.10.2015 08:03
quelle
0

Sie können versuchen:

%Vor%     
Nguyễn Hải Triều 16.10.2015 08:14
quelle