[MsSql] Grupowanie po dwóch kolejnych datach

Witam

 

Chciałbym zrobić jakiś myk żeby wydając zapytanie SQL do bazy wiersze zostały pogrupowane po datach. Jednak jest pewien problem, jeśli wiersze w bazie mają daty po sobie to powinny zostać zgrupowane w jedno.

Grupa1           Data               Jakas liczba

aaaaa             2014-09-01    12

bbbbbb           2014-09-01    123

bbbbbb           2014-09-02     99

ccccccc           2014-09-04     43

 

Teraz po zapytaniu

 

Chciałbym dostać taki wynik:

Grupa1           Data                Suma(JakasLiczba)

aaaaaa           2014-09-01     12

bbbbbbb         2014-09-01      222

cccccccc         2014-09-04      43

 

I za chiny nie wiem jak wydać takie zapytanie bo zwykły group by Grupa1, convert(date,Data) wyświetli mi 4 wiersze takie same jak dane źródłowe.

Na jakiej podstawie zbiłeś trzeci wiersz z drugim, a nie z pierwszym?

PS

Może to się przyda: http://stackoverflow.com/questions/5662545/how-do-i-group-on-continuous-ranges

Jeśli dobrze zrozumiałem to masz dwa wyjścia

  1. kursor

  2. Rekurencja

 

Podobny (choć dużo bardzie rozbudowany) problem był tematem zadania w konkursie mastercoder.pl

http://mastercoder.pl/tasks.php przeczytaj zadanie i komentarz do dla zadania 6. To powinno cię naprowadzić na rozwiązanie.

 

Jak będę miał chwilę to może coś skrobnę wieczorem.

Znaczy dla grupy b chcesz widzieć pierwszą datę, ale sumę liczb?

Tylko ja to zrozumiałem?

 

połączyć rekordy z datami z różnicą jednego dnia.

 

Hmm jak to napisałem to faktycznie trochę się nie zgadza. @Marcin511 dla kolumny Grupa1 musisz dodać jakiś agregator żeby to zadziałało.

Rzeczywiście niedokładnie napisałem. Pierwszym agregatorem jest Grupa1. Następnie wewnątrz grupy1 jak są dwie daty po sobie (raczej nie myślę o 3 datach i więcej) to chciałbym żeby zostały połączone i w sumie obojętne jest mi którą z dat pokaże, czy pierwszą czy drugą.

Czyli jesli dobrze zrozumialem.

 

Najpierw grupujesz po kolumnie grupa1.

Potem gruoujesz po dacie, ale tylko w przypadku gdy data jest dzien po dniu. Dodatkowo sa tylko 2 daty dla kazdej z grup.

Czy dobrze zrozumialem?

Może spróbujmy tak:

http://sqlfiddle.com/#!6/11776/15

 

Czy to odpowiada twoim wymaganiom, w sensie wyniku dla innych danych też.

 

BTW założenie że będą tylko dwie daty dla danej grupy jest bardzo niebezpieczne, chyba że zagwarantujesz to constraint’em na tabelce.

Problem jest bardziej złożony. Ilość wierszy może być bardzo duża, grup Grupa1 może być też bardzo dużo i dat wewnątrz również bardzo dużo.

jeśli jest tak:

 

A 2014-01-01 1

A 2014-01-02 1

A 2014-02-01 1

A 2014-02-06 1

A 2014-02-09 1

A 2014-03-04 1

A 2014-03-06 1

A 2014-03-07 1

 

To w przypadku takich danych oczekiwany rezultat to:

A 2014-01-01 2

A 2014-02-01 1

A 2014-02-06 1

A 2014-02-09 1

A 2014-03-04 1

A 2014-03-06 2

Proszę: