2017-07-05 3 views
0

extrahieren Ich habe die folgende Abfrage, aus der ich den Medianwert von total_views extrahieren muss.mysql muss Medianwert aus Abfrage

SELECT 
    @rownum:[email protected] + 1 AS row_num, total_views, projectId 
FROM 
    (SELECT 
     a.creation, 
      a.projectId, 
      devices, 
      browserIds, 
      devices + browserIds AS total_views 
    FROM 
     ((SELECT 
     projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'project_creation' 
      AND creation > '2017-04-28') a 
    INNER JOIN ((SELECT 
     COUNT(DISTINCT deviceId) AS devices, projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'open' AND component = 'mobile' 
    GROUP BY projectId) b 
    JOIN (SELECT 
     COUNT(DISTINCT browserId) AS browserIds, projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'open' AND component = 'web' 
    GROUP BY projectId) c ON b.projectId = c.projectId) ON a.projectId = b.projectId 
     OR a.projectId = c.projectId) 
    ORDER BY total_views ASC) d, 
    (SELECT @rownum:=0) e 
; 

Dies ist ein Teil des Ergebnisses:

1 1 151 
2 1 256 
3 1 301 
4 2 404 
5 2 305 
6 3 895 
7 4 654 
8 4 369 
9 9 874 
10 10 123 

Ich brauche die Abfrage zu erweitern den Medianwert von total_views zu extrahieren. Irgendwelche Ideen?

+0

wie 'avg (total_views)'? –

+0

Nein, ich suche den Medianwert, nicht den Durchschnittswert. –

Antwort

0

Die Lösung gefunden, die benötigt wird, um den Wert der @rownum-Variablen zu verwenden, anstatt den Wert des Feldes row_num zu verwenden, um die Position des mittleren Werts zu bestimmen. Ich berechne dann den Durchschnittswert der total_views in der Mitte der Ergebnismenge. (Durchschnitt zweier mittlerer Werte, wenn das Ergebnis eine gerade Anzahl von Zeilen hat. Mittelwert des mittleren Werts, wenn das Resultset eine ungerade Anzahl von Zeilen hat, was dem mittleren Wert entspricht). somit mit der Bedingung:

WHERE row_num in (CEIL(@rownum/2), FLOOR(@rownum/2)) 

vollständige Abfrage:

SELECT avg(total_views) from 
(SELECT 
    @rownum:[email protected] + 1 AS row_num, total_views, projectId 
FROM 
    (SELECT 
     a.creation, 
      a.projectId, 
      devices, 
      browserIds, 
      devices + browserIds AS total_views 
    FROM 
     ((SELECT 
     projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'project_creation' 
      AND creation > '2017-04-28') a 
    INNER JOIN ((SELECT 
     COUNT(DISTINCT deviceId) AS devices, projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'open' AND component = 'mobile' 
    GROUP BY projectId) b 
    JOIN (SELECT 
     COUNT(DISTINCT browserId) AS browserIds, projectId, creation 
    FROM 
     event 
    WHERE 
     kind = 'open' AND component = 'web' 
    GROUP BY projectId) c ON b.projectId = c.projectId) ON a.projectId = b.projectId 
     OR a.projectId = c.projectId) 
    ORDER BY total_views ASC) d, 
    (SELECT @rownum:=0) e) f WHERE row_num in (CEIL(@rownum/2), FLOOR(@rownum/2)) 
;