[MsSql] Grupowanie po dwóch kolejnych datach


(Marcin Obala) #1

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.


(kostek135) #2

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


(Grzelix) #3

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.


(drunkula) #4

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


(Grzelix) #5

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.


(Marcin Obala) #6

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ą.


(StawikPiast) #7

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?


(Grzelix) #8

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.


(Marcin Obala) #9

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


(kostek135) #10

Proszę: