2017-05-26 3 views
1

Ich versuche, Durchschnitt einer Spalte player_count Woche für Woche in den letzten 6 Wochen zu erhalten. Aber das Problem ist, dass ich auch den Beginn und das Ende des Wochentages wünsche, der einem bestimmten Durchschnitt entspricht.MySQL-Wählen Sie Anfang und Ende der Woche zusammen mit dem Durchschnitt einer Spalte (Woche für Woche)

Was ich versucht habe:

SELECT AVG(player_count) as average, 
    updated_at, 
    updated_at + INTERVAL WEEKDAY(updated_at) + 7 DAY as EndDate 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
GROUP BY WEEK(updated_at) 
ORDER BY updated_at DESC 
LIMIT 6 

Die updated_at Spalte soll als Anfang der Woche gemacht werden sollen und EndDate wird als Ende der Woche genommen werden, in denen ein bestimmter Mittelwert der Anzahl von Spielern wird gestellt.

Aber diese Abfrage funktioniert nicht korrekt in Bezug auf die Wochendaten. Ich kann das durchschnittliche Ja holen, aber die Wochendaten werden nicht richtig geholt. Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Sie benötigen einen Ausdruck, der ein beliebiges Datum auf den ersten Tag der Woche, in der es auftritt, abschneidet. Das heißt, es gibt 2017-05-21 (Sonntag) zurück, wenn Sie es geben 2017-05-24

Dieser Ausdruck tut das, vorausgesetzt, Ihre Wochen beginnen am Sonntag. Here's an explanation.

FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7)) 

Dann müssen Sie das als GROUP BY Ausdruck verwenden und einen Ausdruck WHERE.

SELECT AVG(player_count) as average, 
    FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) week_beginning, 
    FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) + INTERVAL 6 DAY week_ending 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
    AND updated_at >= FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) - INTERVAL 6 WEEK 
GROUP BY FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) 
ORDER BY 2 DESC 
LIMIT 6 

Die WHERE filtert automatisch Datensätze aus Ihrer Tabelle aus, die für Ihren Bericht zu alt sind.

Diese Abfrage wird ein wenig wiederholt, aber es funktioniert gut.

Sie könnten eine gespeicherte Funktion wie folgt erstellen:

DELIMITER $$ 
DROP FUNCTION IF EXISTS TRUNC_SUNDAY$$ 
CREATE 
    FUNCTION TRUNC_SUNDAY(datestamp DATETIME) 
    RETURNS DATE DETERMINISTIC NO SQL 
    COMMENT 'returns preceding Sunday' 
    RETURN FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))$$ 
DELIMITER ; 

dann Ihre Abfrage besser lesbar wird:

SELECT AVG(player_count) as average, 
    TRUNC_SUNDAY(updated_at) week_beginning, 
    TRUNC_SUNDAY(updated_at) + INTERVAL 6 DAY week_ending 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
    AND updated_at >= TRUNC_SUNDAY(NOW()) - INTERVAL 6 WEEK 
GROUP BY TRUNC_SUNDAY(updated_at) 
ORDER BY TRUNC_SUNDAY(updated_at) DESC 
LIMIT 6 

Wenn Ihre Wochen beginnen montags die -1 zu einem -2 ändern.

+0

Vielen Dank. Genau das habe ich gebraucht. Hilf dem Community-Mann weiter. –

Verwandte Themen