Oto mój uproszczony kod:
SELECT
a.user_id as User_ID,
min(b.a_day) as Date_from,
max(b.a_day) as Date_to,
c.code as ID
FROM a, b, c
WHERE
a_day > (day, -15, getdate())
GROUP BY
a.user_id,
c.code
Query daje następujące wyniki:
User ID date_from date_to id
1234567 2016-06-13 2016-06-13 B
1234567 2016-06-17 2016-06-17 A
12345672016-06-18 2016-06-18 A
1234567 2016-06-19 2016-06-19 A
1234567 2016-06-20 2016-06-20 A
1234567 2016-06-21 2016-06-21 C
1234567 2016-06-22 2016-06-22 C
1234567 2016-06-23 2016-06-23 D
Potrzebuję czegoś takiego:
User ID date_from date_to id
1234567 2016-06-13 2016-06-13 B
1234567 2016-06-17 2016-06-20 A
1234567 2016-06-21 2016-06-22 C
1234567 2016-06-23 2016-06-23 D
Kiedy używam funkcji min () i max () w grupie przez, agreguje ona grzywnę dla wszystkich rekordów, ale muszę agregować tylko daty o tym samym ID dzień po dniu.
Jakieś pomysły?
Z góry dziękuję.
Odpowiedzi:
4 dla odpowiedzi № 1Możesz to zrobić za pomocą warunkowego grupowania za pomocą CASE EXPRESSION
w GROUP BY
klauzula:
SELECT
a.user_id as User_ID,
min(b.a_day) as Date_from,
max(b.a_day) as Date_to,
c.code as ID
FROM a, b, c
WHERE
a_day > (day, -15, getdate())
GROUP BY
a.user_id,
c.code,
CASE WHEN c.code in ("B","D") THEN b.a_day ELSE 1 END
Który wygeneruje to jako GROUP BY
klauzula:
c.code = "B" -> a.user_id,c.code,b.a_day
c.code <> "B" -> a.user_id,c.code,1