2016-05-19 15 views
0

Angenommen, ich habe eine Tabelle mit den folgenden Spalten.LAG-Aggregation Probleme

yr  mo  group players 

Jahr das Jahr in vier Ziffern ist 20xx, Monat ist ein zweistelliger Monat, ist Gruppe eine eindeutige Gruppenkennung - numerisch und die Spieler ist die Anzahl der Spieler für ein bestimmtes Jahr Monat.

Ich versuche - und andernfalls - eine Abfrage zu schreiben, dass für jeden Monat gibt die folgend:

  • die Anzahl der Gruppen in der aktuellen Periode,
  • die Anzahl der Gruppen im Zeitraum 1 Jahr zurück,
  • der Unterschied in der Anzahl der Gruppen

AND (hier ist der Teil, den ich wirklich stecke) sieht, dass die Gruppen in der aktuellen Periode - Paare sie mit den Gruppen, die die gleichen ID's haben und den Nettounterschied in den Spielern ausrechnen.

Als ein grundlegendes Beispiel, wenn es Gruppen 1,2,3 mit Spielern 3,4,5 beziehungsweise in 1,2014 und Gruppen 1,2 mit Spielern 2,3 in 1, 2015 gäbe, wäre der Unterschied in Spielern -2 und die Differenz in Gruppen wie folgt 1.

+0

Wie groß wäre der Unterschied bei den Spielern -2, wenn 2014 12 Spieler hatte und 2015 5 Spieler? Oder sind diese Spielerzahlen, aber wie berechnen Sie es dann noch? Wie ist es dazu gekommen, dass sowohl Spieler als auch Gruppen im Jahr 2015 zurückgegangen sind, aber der Unterschied in den Spielern ist negativ, während der Unterschied in den Gruppen positiv ist? Können Sie einige Beispieldaten in Ihrer Tabelle und Ihre gewünschten Ergebnisse mit ein wenig mehr Klarheit über die Berechnungen zeigen? Ich habe das Gefühl, dass ein Self-Join auf voraggregierten Unterabfragen besser passt als eine Verzögerung oder eine andere Fensterfunktion. – JNevill

+0

Ich dachte mir selbst beizutreten, aber ich hatte ein kleines Problem damit. Der Unterschied ist -2, da es Gruppen 1,2 gibt, die in beiden Zeiträumen existieren. Es ist also die Summe der Spieler in den Gruppen 1,2 für 1,2015 (5) minus der Summe der Spieler in Gruppen 1,2 für 1,2014 (7). – windsormatic

Antwort

0

Probieren Sie etwas wäre:

SELECT 
    COUNT(DISTINCT p2.grp) as grp_current_period, 
    COUNT(DISTINCT p1.grp) AS grp_last_year, 
    COUNT(DISTINCT p2.grp) - COUNT(DISTINCT p1.grp) AS grp_diff, 
    SUM(CASE WHEN p1.grp IS NULL THEN 0 
     ELSE SUM(p2.players - p1.players) 
    END) as players_diff 
FROM 
    myTable p2 LEFT JOIN 
    myTable p1 ON p2.mo = p1.mo AND 
       p2.yr = p1.yr - 1 AND 
       p2.grp = p1.grp 
GROUP BY p2.yr, p2.mo 

Hier habe ich den aktuellen Monat/Jahr bis Vorjahr am Füge- und wenn Team nicht Spieler Unterschied bestehen auf Null.