2017-04-12 3 views
0

Ich habe einen Datensatz übernommen und die folgende Abfrage es um die Ereignisse zu filtern, die ich will:Wie kann ich Vorkommnisse zählen, die unmittelbar auf ein anderes Ereignis in SQL folgen?

SELECT player_id, team_id, pbp_id, event_desc_id 
FROM GamsetPBP 
WHERE event_desc_id = '2FGM' OR event_desc_id = '3FGM' OR event_desc_id = '2FGA' OR event_desc_id ='3FGA' OR event_desc_id = 'O'; 

Wenn ich das tue, es zeigt alle Instanzen dieser Ereignisse. Ich möchte alle Instanzen zählen, bei denen ein 2FGM, 3FGM, 2FGA oder 3FGA innerhalb von zwei Ereignissen eines 'O'-Ereignisses auftritt, basierend auf der pbp_id.

Wenn also ein 'O' eine pbp_id von 45 hat und es eine '2FGM' mit einer pbp_id von 47 gibt, möchte ich es zählen können. Irgendwelche Vorschläge, wie ich Ereignisse in einem solchen Bereich zählen kann?

+0

(1) Haben Sie Ereignisse für den gleichen Spieler zählen möchten oder für das gleiche Team oder nur für den ganzen Tisch (das würde nicht viel Sinn machen). (2) Was ist der Primärschlüssel Ihrer Tabelle? (3) Können Sie Beispieldaten und die gewünschte Ausgabe für diese Daten bereitstellen? (4) Was hat 47 mit 45 zu tun? – trincot

+0

mySQL? SQL Server, Oracle, DB2? Welche Engine und Version? – xQbert

Antwort

0

Von dem, was ich verstehe Sie diese Abfrage verwenden:

SELECT  COUNT(DISTINCT a.pbp_id) 
FROM  GamsetPBP a 
INNER JOIN GamsetPBP b 
     ON b.pbp_id BETWEEN a.php_id + 1 AND a.php_id + 2 
     AND b.event_desc_id IN ('2FGM', '3FGM', '2FGA', '3FGA') 
     -- ... any other join conditions on player_id? team_id? 
WHERE  a.event_desc_id = 'O'; 

Dadurch wird die Anzahl der „O“ Ereignisse zählt, die ein Ereignis haben mit einer ID folgenden es, die ein oder zwei größer ist, und die eine Geben Sie Folgendes ein: 2FGM, 3FGM, 2FGA oder 3FGA. Es könnte natürlich zwei davon geben, aber die obige Abfrage zählt das nur als eine Instanz.

Wenn Sie solche "Doppelgänger" getrennt zählen möchten, entfernen Sie das Wort DISTINCT.

Aus Ihrem Kommentar wurde klar, dass die zwei Datensätze (der mit "O" und der mit dem anderen Typ) zum selben Team gehören und pro Team gezählt werden sollten, wobei die höchsten Punkte zuerst aufgeführt werden.

In diesem Fall fügen Sie das Team Zustand in der join, wählen Sie die Team-ID, Gruppen durch und Ordnung durch die Zählung:

SELECT  a.team_id, 
      COUNT(DISTINCT a.pbp_id) 
FROM  GamsetPBP a 
INNER JOIN GamsetPBP b 
     ON b.pbp_id BETWEEN a.php_id + 1 AND a.php_id + 2 
     AND b.event_desc_id IN ('2FGM', '3FGM', '2FGA', '3FGA') 
     AND b.team_id = a.team_id 
WHERE  a.event_desc_id = 'O' 
GROUP BY a.team_id 
ORDER BY 2 DESC; 
+0

Das hat gut funktioniert, um die Gesamtzahl der Vorkommnisse zu zählen, also danke für den Tipp! Ich brauchte meinen Datensatz von über 40.000 auf 600, was in dem Bereich lag, den ich erwartet hatte. Gibt es eine einfache Möglichkeit, alle pbp_id-Instanzen aufzulisten, in denen dies aufgetreten ist? Oder genauer, ich hoffe zu sehen, wie oft es für jede team.id aufgetreten ist, also konnte ich von diesen 600 Vorkommen sehen, welche Teams am meisten hatten und welche die geringste –

+0

hatte. Ich modifizierte die zweite Abfrage in meiner Antwort, um eine zu liefern Zählen Sie pro Team und listen Sie diese zuerst mit den höchsten Werten auf. – trincot

+0

Das hat perfekt funktioniert, danke. Ich war auch in der Lage, eine ähnliche Abfrage zu verwenden, um es nach Spieler auszuführen. Ich schätze die Hilfe! –

Verwandte Themen