[MySQL] Start-Endzeit zu einer Gruppe aus einem Auftrag

Prengepower

Mitglied
Hi!

Ich habe folgendes Problem:
Ich habe eine MySQL Tabelle mit folgenden Beispiel-Daten:
ID | Name | Datum
1 | A | 1.1.
1 | B | 2.1.
2 | A | 1.1.
2 | A | 1.1.
2 | A | 2.1.
2 | B | 2.1
2 | B | 3.1.
2 | C | 4.1.
3 | A | 1.1.
3 | D | 3.1.
4 | D | 1.1.

So daraus möchte ich jetzt folgendes ermitteln: ich brauche die Start und Endzeit eines jeden Auftrags. Dabei ist aber zu beachten, dass die Startzeit immer der Augenblick ist, in dem der Name das erste mal mit der ID in Berührung kommt. Die Endzeit ist aber die Startzeit von der Gruppe danach dann..

Es sollte also beispielsweise für die ID 2 folgendes herauskommen:

ID | Name | Start | Ende
2 | A | 1.1. | 2.1
2 | B | 2.1 | 4.1
2 | C | 4.1. | 4.1

Ich habe schon viel rumprobiert aber es nicht so wirklich geschafft.
Das einzige ist die Startzeit, die denke ich so ganz gut klappt:

Code:
SELECT
    id,
    name,
    DATE_FORMAT(startdate, '%M %e, %Y, %l:%i%p') as startdate
FROM
    (
        SELECT
            id,
            startdate,
            name
        FROM
            (
                SELECT
                    id, 
                    name,
                    @startdate := IF(@lastid = id AND @lastname = name, @startdate, datum) AS startdate,
                    @lastid := id,
                    @lastname:= name
                FROM
                    (SELECT @lastid:='', @lastname= '', @startdate = '') AS vars,
                    (SELECT * FROM test ORDER BY id asc, datum asc) AS daten
            ) AS daten
    ) AS daten
GROUP BY
    id,
    startdate
Order by id ASC

Wär super wenn mir jemand helfen könnte :)

Danke :)
 
Das hat meine Hirnwindungen wieder mal angeregt....

SQL:
SELECT
	start_daten.id,
	end_daten.name,
	start_daten.datum AS start_datum,
	end_daten.datum AS end_datum
FROM
	-- start_daten: Das Datum des startes der Periode
	(
		SELECT
			*
		FROM
			(
				SELECT 
					IF(NOT (id=@l_id AND name=@l_name), rownum, NULL) AS start_rownum,
					@l_id := id AS id,
					@l_name := name AS name,
					datum
				FROM
					(SELECT @l_id:='', @l_name:='') AS vars1,
					(SELECT
						@rownum:=@rownum+1 AS rownum,
						daten0.* 
					FROM
						( SELECT * FROM test2) AS daten0,
						(SELECT @rownum:=0) AS vars0) AS daten1
			) AS daten2
		WHERE
			NOT start_rownum IS NULL
	) AS start_daten
	INNER JOIN
	-- end_daten: Das Datum des Perioden-Endes. Analog zu start_daten, aber nach absteigender 
	-- Zeilennummer (rownum) gerechnet
		(
			SELECT
				*
			FROM
				(
					SELECT 
						IF(NOT (id=@l_id AND name=@l_name), rownum, NULL) AS end_rownum,
						@l_id := id AS id,
						@l_name := name AS name,
						datum
					FROM
						(SELECT @l_id:='', @l_name:='') AS vars1,
						(SELECT
							@rownum:=@rownum+1 AS rownum,
							daten0.* 
						FROM
							( SELECT * FROM test2) AS daten0,
							(SELECT @rownum:=0) AS vars0
						ORDER BY rownum DESC) AS daten1
				) AS daten2
			WHERE
				NOT end_rownum IS NULL
		) AS end_daten
	ON start_daten.id = end_daten.id AND start_daten.name = end_daten.name
ORDER BY
	start_daten.start_rownum
 
Zuletzt bearbeitet von einem Moderator:
Ich kam auf sowas
SQL:
SELECT g.id, g.name, t1.start_datum, t2.end_datum FROM gruppen AS g,
	(SELECT id, name, MIN(datum) AS start_datum FROM gruppen GROUP BY id, name) AS t1,
	(SELECT id, name, MAX(datum) AS end_datum FROM gruppen GROUP BY id, name) AS t2
WHERE g.id=t1.id AND g.id=t2.id AND g.name=t1.name AND g.name=t2.name #AND g.id=2
GROUP BY g.id, g.name

Liefert das gleiche Ergebnis. Ich kann aber nicht beurteilen, inwiefern beide sich in Performance unterscheiden.
 
Zuletzt bearbeitet:
okay also das erste habe ich jetzt mal probiert und musste abbrechen weil es bei meiner tabelle schon über eine halbe stunde gedauert hat und immernoch kien ergebnis da war (die tabelle hat derzeit etwa 170.000 einträge)...

das andere werde ich jetzt mal testen ;)
 
Mit einem index über (id, name) würde meine Abfrage vermutlich nochmal beschleunigt werden.
Aber erstmal abwarten, ob sie überhaupt tut.

Edit: Du kannst auch ein "WHERE id=2" noch in die beiden Unter-Abfragen einfügen.
 
Zuletzt bearbeitet:
Ich ging von der alten Tabelle aus, die irgendwo im Forum ist..
Da gibts halt sowas

2 A 1.1
2 A 2.1
2 B 3.1
2 A 4.1

Und dann währen das 3 Perioden
2 A 1.1 bis 2.1
2 B 3.1 bis 3.1
2 A 4.1 bis 4.1
 
Ich ging von der alten Tabelle aus, die irgendwo im Forum ist..
Da gibts halt sowas

2 A 1.1
2 A 2.1
2 B 3.1
2 A 4.1

Und dann währen das 3 Perioden
2 A 1.1 bis 2.1
2 B 3.1 bis 3.1
2 A 4.1 bis 4.1

ne ne das würde so nicht hinhauen... aber meine tabelle ist halt voll mit ein haufen IDs und nen Haufen Namen...

Aber es sollte folgendes bei den 3 Perioden rauskommen:

2 A 1.1 bis 3.1. (wo B anfängt)
2 B 3.1 bis 4.1. (wo A wieder anfängt)
2 A 4.1 bis 4.1 (kann im Endeffekt entfallen)

Edit:
Ich habe jetzt selbst auch nocheinmal ein wenig probiert...
Mein Statement funktioniert auch ansich, aber immer nur nach der 2. Ausführung. Bei der ersten Ausführung sind Start und Ende identisch o_O Woran liegt das?

Code:
SELECT
    id,
    name,
    status,
    DATE_FORMAT(startdate, '%Y-%m-%d %T') as startdate,
    DATE_FORMAT(enddate, '%Y-%m-%d %T') as enddate
FROM
    (
        SELECT
            id,
            status,
            startdate,
            enddate,
            name
        FROM
            (
                SELECT
                    id, 
                    name,
                    status,
                    datum AS startdate,
                    @enddate := IF(@lastid = id AND @tempdate <> '', @tempdate, datum) AS enddate,
                    @tempdate := datum,
                    @lastid := id,
                    @lastname := name
                FROM
                    (SELECT @lastid:='', @lastname = '', @enddate = '', @tempdate = '') AS vars,
                    (SELECT * FROM test ORDER BY id asc, datum desc) AS daten
            ) AS daten
    ) AS daten
WHERE status NOT LIKE 'TEST'
AND owner LIKE 'TEST%'
Order by ticketid ASC

Woran liegt das?
Ich weiß das das nicht genau das erfüllt was ich brauche, aber es wäre auch in Ordnung. Ich würde mir dann halt für jeden "Zwischenschritt" einfach die Dauer ermitteln (brauche Nettoarbeitszeit) und dann halt pro Gruppe pro Ticket summieren... Er soll hier sozusagen nur die Startzeit von dem nächsten Element als Endzeit nehmen...
 
Zuletzt bearbeitet:
Also leider funktionieren beide Statement irgendwie nicht :( Das zweite mit den inneren Selects lief gestern sage und schreibe 2 (!!) Stunden und es kam absolut kein Ergebnis dabei heraus :(

Bitte um Hilfe!!
 
Ist es vielleicht möglich, ein Dump der Tabelle hochzuladen? Du kannst ja eventuell die Daten verfremden. Ich würde es nur gerne mit den "echten" Daten probieren.
 
ne das geht leider nicht weil es sensible daten sind...

mein Problem ist ja hauptsächlich, dass ich die Abfrage von Talend Open Studio automatisch starten will und das geht halt nicht -.-
 

Neue Beiträge

Zurück