Begin Eind datum lijst met data
Hallo Allemaal
Ik heb in een mysql table met daarin data.
Nu wil ik van een serie data de begin en eind datum hebben.
Het lukt me al redelijk met de volgende query:
Echter komt bij dit resultaat nu de begin en eind datum op een verschillende row te staan wat natuurlijk niet praktisch is.
Weet iemand hoe ik dit kan oplossen?
Ik heb in een mysql table met daarin data.
Nu wil ik van een serie data de begin en eind datum hebben.
Het lukt me al redelijk met de volgende query:
Quote:
<
SELECT t1.date as start_date, '' as end_date
FROM test as t1
WHERE t1.date NOT IN(
SELECT DATE_ADD(t2.date, INTERVAL 1 DAY)
FROM test as t2
)
UNION
SELECT '' as start_date, t3.date as end_date
FROM test as t3
WHERE t3.date NOT IN(
SELECT DATE_SUB(t4.date, INTERVAL 1 DAY)
FROM test as t4
)
SELECT t1.date as start_date, '' as end_date
FROM test as t1
WHERE t1.date NOT IN(
SELECT DATE_ADD(t2.date, INTERVAL 1 DAY)
FROM test as t2
)
UNION
SELECT '' as start_date, t3.date as end_date
FROM test as t3
WHERE t3.date NOT IN(
SELECT DATE_SUB(t4.date, INTERVAL 1 DAY)
FROM test as t4
)
Echter komt bij dit resultaat nu de begin en eind datum op een verschillende row te staan wat natuurlijk niet praktisch is.
Weet iemand hoe ik dit kan oplossen?
Als je op zoek bent naar de eerste en laatste datum kan dat toch met
Mathijs geef eens aan welke gegevens je opslaat, en wat ja als resultaat zou willen hebben.
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
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
Gewijzigd op 02/12/2014 09:08:36 door Matthijs Vos
Een truukje met uservars:
Dan daaroverheen:
Dan daaroverheen:
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:
gebruiker | datum |
-------------------
1 | 2014-12-20
1 | 2014-12-20
1 | 2014-12-21
2 | 2014-12-21
2 | 2014-12-22
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?
gebruiker | datum |
-------------------
1 | 2014-12-20
1 | 2014-12-20
1 | 2014-12-21
2 | 2014-12-21
2 | 2014-12-22
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
Toevoeging op 28/12/2014 20:45:10:
Ik had lokaal al een testje gedaan, voor een werkend voorbeeld zie SQLFiddle
We gaan de subquery uitbreiden met een controle op de user_id
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
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
Toevoeging op 28/12/2014 20:45:10:
Ik had lokaal al een testje gedaan, voor een werkend voorbeeld zie SQLFiddle




