/ / Wie gruppiere ich mit einer Ausnahme nach? - SQL, SQL-Server

Wie gruppiere ich mit einer Ausnahme nach? - SQL, SQL-Server

Hier ist mein vereinfachter Code:

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

Abfrage gibt die folgende Ausgabe aus:

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

Ich brauche so etwas:

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

Wenn ich die Funktionen min () und max () mit group by verwende, werden alle Datensätze ordnungsgemäß aggregiert, aber ich muss nur Daten mit derselben ID Tag für Tag aggregieren.

Irgendwelche Ideen?

Danke im Voraus.

Antworten:

4 für die Antwort № 1

Sie können dies mit der bedingten Gruppierung tun, indem Sie verwenden CASE EXPRESSION in dem GROUP BY Klausel:

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

Welches wird dies als die generieren GROUP BY Klausel:

c.code = "B" -> a.user_id,c.code,b.a_day
c.code <> "B" -> a.user_id,c.code,1