[MySQL] timestamp abfragen aber jeden Tagt nur einmal beachten

Gray

Erfahrenes Mitglied
Hi,

ich habe eine Tabelle mit positionen und möchte mir die Anzahl der positionen 1-10 in einem Monat anzeigen lassen.
Nun ist das Problem das gelegentlich die Daten mehrfach pro Tag erfasst werden. Es darf aber pro Tag nur ein Wert (der niedrigste) beachtet werden.

Die Tabelle sieht ungefähr wie folgt aus:

Code:
timestamp	|position
----------------------
1.1.12 10:48|		 1
2.2.12 09:33|		 4
2.2.12 16:43|		 5
3.2.12 08:00|		 2
4.2.12 22:59|		 3
5.2.12 19:45|		11
5.2.12 23:33|		 9
6.2.12 19:45|		15

Den Timestamp habe ich zur Verdeutlichung durch das Datum und die Uhrzeit ersetzt.

Es kommt also der 2.2.12 und der 5.5.12 jeweils zwei mal vor, hierbei daf aber immer nur der Eintrag mit der niedrigsten Position beachtet werden.

Das Ergebnis welches ich in diesem Fall haben möchte währe 5
Da an insgesamt 5 Tagen die position zwischen 1 und 10 gelegen hat.

--

Derzeit gehe ich wie folgt vor.

Ich gehe jeden Tag des Monats per for-Schleife durch und kontrollieren dann jeden Tag einzeln.

Code:
SELECT
	position
FROM
	monitoring
WHERE
	timestamp BETWEEN $timestamp_frueh AND $timestamp_abend
AND
	position BETWEEN 1 AND 10
ORDER BY
	position
LIMIT 1

Insofern ein Ergebnis heraus kommt addiere ich einfach +1 zu einer Variable hinzu.

--

Nun würde ich gerne den gesamten Monat in einem Durchlauf kontrollieren. Mein Problem ist hierbei das ich kein GROUP BY verwenden kann, da der Timestamp von Tag X ein paar Minuten oder auch Stunden auseinander liegen kann.

Ich hoffe Ihr versteht was ich meine, thx.
 
Zuletzt bearbeitet:
Alle Positionen ermitteln;
SQL:
SELECT
	DATE(m.`timestamp`) AS date_day,
	MIN(m.`position`) AS min_pos_per_day
FROM
	monitoring AS m
WHERE
	timestamp BETWEEN $timestamp_frueh AND $timestamp_abend
GROUP BY
	DATE(m.`timestamp`)
HAVING
	MIN(m.`position`) BETWEEN 1 AND 10
und zählen:
SQL:
SELECT
	COUNT(*)
FROM
	(
		-- Kleinste Position pro Tag ermitteln
		SELECT
			MIN(m.`position`) AS min_pos_per_day
		FROM
			monitoring AS m
		WHERE
			timestamp BETWEEN $timestamp_frueh AND $timestamp_abend
		GROUP BY
			DATE(m.`timestamp`)
		HAVING
			MIN(m.`position`) BETWEEN 1 AND 10
	) AS timestamp
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück