2016-09-14 1 views
9

Hier ist mein vereinfachten Code:Wie GROUP BY mit einer Ausnahme?

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 die folgende Ausgabe gibt:

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 so etwas wie dieses brauchen:

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 min() und max () funktioniert mit group by, es aggregiert für alle Datensätze, aber ich muss Tag für Tag nur Daten mit der gleichen ID aggregieren.

Irgendwelche Ideen?

Vielen Dank im Voraus.

+0

Probentabellendaten hinzufügen. (Das gibt das angegebene Ergebnis.) – jarlh

Antwort

4

Sie können es mit bedingter Gruppierung tun, indem CASE EXPRESSION in der 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 

Welcher dies als GROUP BY Klausel generieren:

c.code = 'B' -> a.user_id,c.code,b.a_day 
c.code <> 'B' -> a.user_id,c.code,1 
+0

Danke für Ihre Antwort, aber ich habe mehr IDs als nur A und B. So kann ich keine Daten erhalten, die auf diesen Datensätzen beruhen. Ich denke, es sollte prüfen, ob es einige fortgesetzte Termine gibt und dann die Gruppe für zwei Gruppen separat machen (Fortsetzung und einzelne Tage). – aoc24

+0

Ich verstehe nicht, Sie sollten alles in der Frage erwähnen! Was ist das Problem hier? Gibt es mehr Codes, die täglich gruppiert werden sollten? Welche sind sie? – sagi

+0

Entschuldigung dafür. ID kann A, B, C, D usw. sein. Das Wichtigste für mich ist es, eine Lösung zu finden, die es ermöglicht Tag für Tag Daten mit derselben ID für einen Tag und Datumsbereiche zu erhalten. Ich habe meinem Code eine weitere ID hinzugefügt. – aoc24