/ / Jak GROUP BY z wyjątkiem? - sql, sql-server

Jak GROUP BY z wyjątkiem? - sql, sql-server

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 № 1

Moż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