Letztes Ergebnis abschneiden

Tommy57

Erfahrenes Mitglied
Hallo,

ich steh momentan vor einem Problem, wo ich nach einer guten und einfachen Lösung suche.

Ich möchte einen Chart darstellen, wo ich den Durchschnitt aller Tagespreise zu Monaten zusammenfasse. Das ist soweit kein Problem. Nun möchte ich aber, dass der erste und letzte Wert dem exakten ersten und letzten Tageswert entspricht. Dafür gehe ich hin und schneide per OFFSET 1 das erste Ergebnis ab, sortiere danach alle Ergebnisse in umgekehrter Reihenfolge und schneide erneut das erste Ergebnis per OFFSET 1 ab. Weiß jemand vielleicht, ob das noch einfach geht?

SQL:
    SELECT
        extract(year from day_of_value) as year,
        extract (month from day_of_value) as month,
        value
    FROM
        (SELECT
            day_of_value,
            value
        FROM
            sells
        WHERE
            id = 1
        ORDER BY
            day_of_value ASC
        LIMIT 1) tmp

UNION ALL

    SELECT
        year,
        month,
        value
    FROM
        (SELECT
            extract(year from day_of_value) as year,
            extract (month from day_of_value) as month,
            AVG(value) AS value
        FROM
            sells
        WHERE
            id = 1
        GROUP BY
            year,
            month
        ORDER BY
            year DESC,
            month DESC
        OFFSET 1) tmp
    ORDER BY
        year,
        month
    OFFSET 1

UNION ALL

    SELECT
        extract(year from day_of_value) as year,
        extract (month from day_of_value) as month,
        value
    FROM
        (SELECT
            day_of_value,
            value
        FROM
            sells
        WHERE
            id = 1
        ORDER BY
            day_of_value DESC
        LIMIT 1) tmp

Gruß, Tommy
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich denke mal das es auf jeden Fall einfacher geht. Wie sieht denn die Datenstruktur in der entsprechenden Tabelle denn genau aus?
Order geht es nur darum, den ersten und letzten Wert abzuschneiden?
 
Oder geht es nur darum, den ersten und letzten Wert abzuschneiden?

Ja, genau darum geht's. Bei dem Chart handelt es sich um monatliche Durchschnittspreise. Neben dem Chart werden aber Start- und Endwert angegeben, die ja in jedem Fall dem genau ersten und letzten Wert aus der Datenbank entsprechen. Dadurch stimmt der Chart mit diesen Werten nicht überein, da zB der Startwert bei 1.600€ liegt, der Chart aber bei 1.800€ startet. Um das Problem zu umgehen, war meine Überlegung den Chart zu lassen, wie er ist, und nur den ersten und letzten Wert auszutauschen.

Bei PHP gibt es ja zum Beispiel bei substr die Möglichkeit mit -1 zu arbeiten. Vllt gibt es bei MySQL etwas ähnliches um schnell und einfach erstes und letztes Ergebnis rauszuwerfen, ohne vorher die genaue Anzahl der Ergebnisse zu kennen.

Gruß, Tommy
 
Nein wenn du vorher nicht die genaue Anzahl an Ergebnissen kennst kann mysql das nicht direkt. Wie sieht deine Tabelle den genau aus. Ich blicke noch nicht ganz durch
 
In der Tabelle werden Tageswerte gespeichert. Die id gehört zu Items vom User.

Nach dem Statement brauche ich den ersten Wert, dann alle zusammen gefassten Werte und dann den letzten Wert. Das Statement, dass ich oben reingeschrieben habe, funktioniert ja. Ich frag mich halt, ob das nicht noch einfacher und besser geht, als mit OFFSET den ersten Wert abzuschneiden, dann die Werte per ORDER BY umzudrehen und wieder mit OFFSET den ersten Wert abzuschneiden.

SQL:
id      day_of_value          value
1       '2001-01-01'          1187.73
1       '2001-01-02'          1189.27
1       '2001-01-03'          1192.14
1       '2001-01-04'          1186.26
1       '2001-01-05'          1195.32
1       '2001-01-06'          1202.44
1       '2001-01-07'          1187.39
1       '2001-01-08'          1207.52
1       '2001-01-09'          1202.55
1       '2001-01-10'          1224.53
1       '2001-01-11'          1218.41
1       '2001-01-12'          1213.38
1       '2001-01-13'          1225.49
...
...
...
1       '2013-05-22'          2847.87
1       '2013-05-23'          2852.72
1       '2013-05-24'          2851.79
1       '2013-05-25'          2853.81

Gruß, Tommy
 
Zuletzt bearbeitet von einem Moderator:
Sowas in der Art würde ich machen. (Ist ungetestet)

Code:
SELECT 
	YEAR(day_of_value) AS YEAR,
	MONTH(day_of_value) AS MONTH,
	VALUE
FROM sells
WHERE id = 1
LIMIT 1

UNION ALL
SELECT YEAR, MONTH, AVG(VALUE) AS VALUE FROM (
	SELECT
		YEAR(day_of_value) AS YEAR,
		MONTH(day_of_value) AS MONTH,
		VALUE AS VALUE
	FROM	sells
	WHERE id = 1
		AND day_of_value > (SELECT MIN(day_of_value) FROM sells)
		AND day_of_value < (SELECT MAX(day_of_value) FROM sells)
	) as tb1
GROUP BY YEAR, MONTH
	
UNION ALL

SELECT 
	YEAR(day_of_value) AS YEAR,
	MONTH(day_of_value) AS MONTH,
	VALUE
FROM sells
WHERE id = 1
ORDER BY day_of_value DESC
LIMIT 1

wenn ich dich richtig verstanden habe :D
 
Hi Nino14,

danke. Das ist eine gute Idee, aber du schneidest ja genau nur den ersten Tag weg. Wenn in der gleichen Woche mehrere Tage sind, hab ich die Woche zwei mal drin. Aber der Ansatz ist gut. Da kann ich dran anknüpfen. Hab gerade auch eine bessere Methode als dieses Extract gefunden.

SQL:
date_trunc('month', day_of_value) AS month

Dadurch krieg ich sogar das Datum der Woche und nicht nur ne blöde Zahl.

Super! Damit kann ich das jetzt schön fertig schreiben.

Danke!
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück