Ik heb een lijst met data in mijn database. Voorbeeld:
2014-12-01
2014-12-02
2014-12-02
2014-12-03
2014-12-10
2014-12-11
Nu wil ik van de opvolgende data het begin en het einde weten. Het is zoals in het voorbeeld te zien is ook mogelijk dat een datum meerdere keren voorkomt, maar dat moet niet uitmaken. In het voorbeeld wil ik dan als resultaat:
start_datum | eind_datum
2014-12-01 | 2014-12-03
2014-12-10 | 2014-12-11
SELECT MIN(adate), MIN(adate) INTO @checkdate, @pointer FROM date_test;
Dan daaroverheen:
SELECT
start_date,
MAX(edate) end_date
FROM
(SELECT
@pointer:= CASE WHEN adate - INTERVAL 1 DAY > @checkdate THEN adate ELSE @pointer END start_date,
@checkdate := adate edate
FROM
date_test ORDER BY adate) d
GROUP BY start_date
Bedankt voor je reactie. Ik ben er net weer even mee bezig geweest en het werkt inderdaad. Wat echter het geval is is dat er meerdere gebruikers zijn. Dit conflicteert met elkaar bij deze oplossing. Voorbeeldje:
Nu krijg ik als result start_date 2014-12-20 en als end_date 2014-12-22. Terwijl ik graag 2 results wil, 1 voor user 1 en eentje voor user 2. Hoe kan ik dit oplossen?
Met een uservar kan je de waarde van een veld uit de vorige rij bij houden.
We gaan de subquery uitbreiden met een controle op de user_id
SELECT
user_id,
start_date,
MAX(end_date) end_date
FROM
(SELECT
@pointer:= CASE
WHEN user_id <> @user THEN adate
ELSE
CASE
WHEN adate - INTERVAL 1 DAY > @checkdate THEN adate
ELSE @pointer
END
END start_date,
@checkdate := adate end_date,
@user := user_id user_id
FROM
date_test
CROSS JOIN (SELECT @user := 0) x
ORDER BY user_id, adate
) d
GROUP BY user_id, start_date
[size=xsmall]Toevoeging op 28/12/2014 20:45:10:[/size]
Ik had lokaal al een testje gedaan, voor een werkend voorbeeld zie SQLFiddle