FIRST LAST, MIN, MAX von GROUP BY für Zeitgruppierungen

ich will den ersten, höchsten, niedrigsten und letzten wert aus einer group (nur performanter als hier)
und ich wollte wissen, wie man zeitlich gruppiert 15 min, 15 sec usw

im aktuellen statement gruppiert er ja nach minute
(hour und day usw notwendig um überlappungen zu vermeiden)

SELECT
a.midvalue as open,
MAX(a.midValue) as high,
MIN(a.midValue) as low,
(SELECT m2.midValue FROM mi_x_dax m2 WHERE m2.timestamp = MAX(a.timestamp)) as close,
a.timestamp FROM mi_x_dax a
GROUP BY MINUTE(a.timestamp), HOUR(a.timestamp), DAY(a.timestamp)
ORDER BY a.timestamp asc

"GROUP BY DATE_FORMAT(a.timestamp, ‘%i’) = 15, DATE_FORMAT(a.timestamp, ‘%i’) = 30, DATE_FORMAT(a.timestamp, ‘%i’) = 45, HOUR(a.timestamp), DAY(a.timestamp)

evntl so statt
GROUP BY MINUTE(a.timestamp), HOUR(a.timestamp), DAY(a.timestamp)

???

Schnellschuß:
test=*# select now();
now

2007-07-05 18:58:31.645647+02
(1 row)

Time: 0.714 ms
test=*# select date_trunc(‘hour’, now()) || case when extract(minute from now()) between 0 and 14 then ‘-1’ when extract(minute from now()) between 15 and 29 then ‘-2’ when extract(minute from now()) between 30 and 44 then ‘-3’ when extract(minute from now()) between 45 and 59 then ‘-4’ end;
?column?

2007-07-05 18:00:00+02-4
(1 row)
[/code]

Der Trick ist, mit CASE je nach Zeitpunkt etwas anderes zu erzeugen - hier lediglich ein Strin ‘-X’ mit X von 1-4. Benenne es nach Deinem Geschmack und gruppiere nach der Spalte. Okay?

Andreas

:frowning:

kriegs nicht auf meinen sql string adaptiert
und in mysql gibts datetrunc gar net

Okay, noch mal:

Du hast diese Tabelle:

test=*# select * from zeiten;
         ts          | val
---------------------+-----
 2007-01-01 10:00:01 |   2
 2007-01-01 11:20:04 |   3
 2007-01-01 11:25:00 |   4
 2007-01-01 11:40:00 |  10
 2007-01-01 11:42:00 |  20
(5 rows)

Und willst das pro Viertelstunde gruppiert aufsummiert haben:

test=*# select date_trunc('hour', ts) || '--' || (extract(minute from ts)::int / 15)::text, sum(val) from zeiten group by 1 order by 1;
        ?column?        | sum
------------------------+-----
 2007-01-01 10:00:00--0 |   2
 2007-01-01 11:00:00--1 |   7
 2007-01-01 11:00:00--2 |  30
(3 rows)

bzw.

test=*# select date_trunc('hour', ts) || '--' || (extract(minute from ts)::int / 15)::text, sum(val), max(val), min(val) from zeiten group by 1 order by 1;
        ?column?        | sum | max | min
------------------------+-----+-----+-----
 2007-01-01 10:00:00--0 |   2 |   2 |   2
 2007-01-01 11:00:00--1 |   7 |   4 |   3
 2007-01-01 11:00:00--2 |  30 |  20 |  10
(3 rows)

Ist hier noch etwas eleganter als im anderen Beitrag von mir, nun klar?

Das an Deine Bedürfnisse anzupassen überlasse ich Dir zur Übung…


Andreas

SELECT
a.midvalue as open,
MAX(a.midValue) as high,
MIN(a.midValue) as low,
(SELECT m2.midValue FROM mi_x_dax m2 WHERE m2.timestamp = MAX(a.timestamp)) as close,
a.timestamp,
Count(a.timestamp),
CASE EXTRACT(MINUTE FROM a.timestamp)
WHEN 0 THEN 1
WHEN 1 THEN 1
WHEN 2 THEN 1
WHEN 3 THEN 1
WHEN 4 THEN 1
WHEN 5 THEN 1
WHEN 6 THEN 1
WHEN 7 THEN 1
WHEN 8 THEN 1
WHEN 9 THEN 1
WHEN 10 THEN 1
WHEN 11 THEN 1
WHEN 12 THEN 1
WHEN 13 THEN 1
WHEN 14 THEN 1
WHEN 15 THEN 2
WHEN 16 THEN 2
WHEN 17 THEN 2
WHEN 18 THEN 2
WHEN 19 THEN 2
WHEN 20 THEN 2
WHEN 21 THEN 2
WHEN 22 THEN 2
WHEN 23 THEN 2
WHEN 24 THEN 2
WHEN 25 THEN 2
WHEN 26 THEN 2
WHEN 27 THEN 2
WHEN 28 THEN 2
WHEN 29 THEN 2
WHEN 30 THEN 3
WHEN 31 THEN 3
WHEN 32 THEN 3
WHEN 33 THEN 3
WHEN 34 THEN 3
WHEN 35 THEN 3
WHEN 36 THEN 3
WHEN 37 THEN 3
WHEN 38 THEN 3
WHEN 39 THEN 3
WHEN 40 THEN 3
WHEN 41 THEN 3
WHEN 42 THEN 3
WHEN 43 THEN 3
WHEN 44 THEN 3
WHEN 45 THEN 4
WHEN 46 THEN 4
WHEN 47 THEN 4
WHEN 48 THEN 4
WHEN 49 THEN 4
WHEN 50 THEN 4
WHEN 51 THEN 4
WHEN 52 THEN 4
WHEN 53 THEN 4
WHEN 54 THEN 4
WHEN 55 THEN 4
WHEN 56 THEN 4
WHEN 57 THEN 4
WHEN 58 THEN 4
WHEN 59 THEN 4
END AS sort
FROM mi_x_dax a
GROUP BY sort, HOUR(a.timestamp), DAY(a.Timestamp), MONTH(a.timestamp)
ORDER BY a.timestamp asc

die lösung - leider klappt between nicht auf EXTRACT(MINUTE FROM a.timestamp) resp. MINUTE(a.timestamp)
in MYSQL

noch ne idee wie ich schneller an den letzten wert in einer group komme?

Hallo,

zur Info: das ist ein Forum über PostgreSQL und nicht MySQL. Wenn du ein Problem mit MySQL hast, solltest du eventuell ein entsprechendes Fachforum aufsuchen…

cu tb.

ok!

trotzdem einer nen plan, wie ich das letzte element aus einer gruppierung bekomme?