🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
14 messages
14 total messages Started by Roman Tyczka Mon, 27 Nov 2017 19:05
Funkcje WINDOW
#195445
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 19:05
29 lines
1487 bytes
Witam,

Bawię się z funkcjami WINDOW, znaczy próbuję, pierwszy test i mam pytania.

SELECT A, B, C,
 SUM(C) OVER (),
 SUM(C) OVER (ORDER BY A, B),
 SUM(C) OVER (PARTITION BY A),
 SUM(C) OVER (PARTITION BY A ORDER BY B)
 FROM TEST

i wyniki:

A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|      
-------------------------------------
1|  1|  30|  141|    30|    60|    30| 
1|  2|  20|  141|    50|    60|    50| 
1|  3|  10|  141|    60|    60|    60| 
2|  1|  25|  141|    85|    40|    25| 
2|  2|  15|  141|   100|    40|    40| 
3|  1|  41|  141|   141|    41|    41| 

kolumna SUM i SUM_2 są jasne. 
Ale jak liczone są wartości w kolumnie SUM_1 i SUM_3?
Wszak ORDER BY wpływa na kolejność, czemu więc sumy są inne?

-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195446
Author: wloochacz
Date: Mon, 27 Nov 2017 20:01
9 lines
1303 bytes
W dniu 2017-11-27 o 20:05, Roman Tyczka pisze:
> Witam,
> 
> Bawię się z funkcjami WINDOW, znaczy próbuję, pierwszy test i mam pytania.
A to się znaczy mamy domyśleć, że o MSSQL chodzi?
A może nie zgadłem?

-- 
wloochacz
Re: Funkcje WINDOW
#195448
Author: Andrzej Stróżyński
Date: Mon, 27 Nov 2017 20:23
37 lines
2222 bytes
W dniu 2017-11-27 o 20:05, Roman Tyczka pisze:
> Witam,
> 
> Bawię się z funkcjami WINDOW, znaczy próbuję, pierwszy test i mam pytania.
> 
> SELECT A, B, C,
>   SUM(C) OVER (),
>   SUM(C) OVER (ORDER BY A, B),
>   SUM(C) OVER (PARTITION BY A),
>   SUM(C) OVER (PARTITION BY A ORDER BY B)
>   FROM TEST
> 
> i wyniki:
> 
> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
> -------------------------------------
> 1|  1|  30|  141|    30|    60|    30|
> 1|  2|  20|  141|    50|    60|    50|
> 1|  3|  10|  141|    60|    60|    60|
> 2|  1|  25|  141|    85|    40|    25|
> 2|  2|  15|  141|   100|    40|    40|
> 3|  1|  41|  141|   141|    41|    41|
> 
> kolumna SUM i SUM_2 są jasne.
> Ale jak liczone są wartości w kolumnie SUM_1 i SUM_3?
> Wszak ORDER BY wpływa na kolejność, czemu więc sumy są inne?

Wnioskuję wyłącznie z obserwacji Twojego wyniku:
ORDER BY powoduje sumowanie narastająco.
SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości 
partycjonującej.
Ciekawe, jaki wynik wyjdzie jeśli w SUM_3 dasz ORDER BY C?


-- 
pozdrawiam
AS
Re: Funkcje WINDOW
#195447
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:40
11 lines
1064 bytes
On Mon, 27 Nov 2017 21:01:19 +0100, wloochacz wrote:

>> Bawię się z funkcjami WINDOW, znaczy próbuję, pierwszy test i mam pytania.
> A to się znaczy mamy domyśleć, że o MSSQL chodzi?
> A może nie zgadłem?

Firebird

-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195449
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:51
42 lines
1842 bytes
On Mon, 27 Nov 2017 21:23:14 +0100, Andrzej Stróżyński wrote:

>> SELECT A, B, C,
>>   SUM(C) OVER (),
>>   SUM(C) OVER (ORDER BY A, B),
>>   SUM(C) OVER (PARTITION BY A),
>>   SUM(C) OVER (PARTITION BY A ORDER BY B)
>>   FROM TEST
>> 
>> i wyniki:
>> 
>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>> -------------------------------------
>> 1|  1|  30|  141|    30|    60|    30|
>> 1|  2|  20|  141|    50|    60|    50|
>> 1|  3|  10|  141|    60|    60|    60|
>> 2|  1|  25|  141|    85|    40|    25|
>> 2|  2|  15|  141|   100|    40|    40|
>> 3|  1|  41|  141|   141|    41|    41|
>> 
> 
> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
> ORDER BY powoduje sumowanie narastająco.
> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości 
> partycjonującej.

czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
trochę nieintuicyjne

> Ciekawe, jaki wynik wyjdzie jeśli w SUM_3 dasz ORDER BY C?

10
30
60
15
40
41


-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195450
Author: Andrzej Stróżyński
Date: Mon, 27 Nov 2017 21:10
49 lines
2280 bytes
W dniu 2017-11-27 o 21:51, Roman Tyczka pisze:
> On Mon, 27 Nov 2017 21:23:14 +0100, Andrzej Stróżyński wrote:
> 
>>> SELECT A, B, C,
>>>    SUM(C) OVER (),
>>>    SUM(C) OVER (ORDER BY A, B),
>>>    SUM(C) OVER (PARTITION BY A),
>>>    SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>    FROM TEST
>>>
>>> i wyniki:
>>>
>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>> -------------------------------------
>>> 1|  1|  30|  141|    30|    60|    30|
>>> 1|  2|  20|  141|    50|    60|    50|
>>> 1|  3|  10|  141|    60|    60|    60|
>>> 2|  1|  25|  141|    85|    40|    25|
>>> 2|  2|  15|  141|   100|    40|    40|
>>> 3|  1|  41|  141|   141|    41|    41|
>>>
>>
>> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
>> ORDER BY powoduje sumowanie narastająco.
>> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości
>> partycjonującej.
> 
> czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
> trochę nieintuicyjne

Odcina PARTITION BY.
ORDER BY decyduje o kolejności sumowania wewnątrz partycji.

> 
>> Ciekawe, jaki wynik wyjdzie jeśli w SUM_3 dasz ORDER BY C?
> 
> 10
> 30
> 60
> 15
> 40
> 41

To potwierdza powyższe.


-- 
pozdrawiam
AS
Re: Funkcje WINDOW
#195451
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:17
39 lines
2134 bytes
On Mon, 27 Nov 2017 22:10:32 +0100, Andrzej Stróżyński wrote:

>>>> SELECT A, B, C,
>>>>    SUM(C) OVER (),
>>>>    SUM(C) OVER (ORDER BY A, B),
>>>>    SUM(C) OVER (PARTITION BY A),
>>>>    SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>>    FROM TEST
>>>>
>>>> i wyniki:
>>>>
>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>> -------------------------------------
>>>> 1|  1|  30|  141|    30|    60|    30|
>>>> 1|  2|  20|  141|    50|    60|    50|
>>>> 1|  3|  10|  141|    60|    60|    60|
>>>> 2|  1|  25|  141|    85|    40|    25|
>>>> 2|  2|  15|  141|   100|    40|    40|
>>>> 3|  1|  41|  141|   141|    41|    41|
>>>>
>>>
>>> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
>>> ORDER BY powoduje sumowanie narastająco.
>>> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości
>>> partycjonującej.
>> 
>> czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
>> trochę nieintuicyjne
> 
> Odcina PARTITION BY.
> ORDER BY decyduje o kolejności sumowania wewnątrz partycji.
 
Ale czekaj... kolumna SUM_1 pochodzi z SUM(C) OVER (ORDER BY A, B) a tu nie
ma PARTITION. Co zatem ucina sumę do raptem jednego wiersza z wartością 30?


-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195452
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:25
17 lines
1574 bytes
On Mon, 27 Nov 2017 22:17:45 +0100, Roman Tyczka wrote:

>>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>>> -------------------------------------
>>>>> 1|  1|  30|  141|    30|    60|    30|

> Ale czekaj... kolumna SUM_1 pochodzi z SUM(C) OVER (ORDER BY A, B) a tu nie
> ma PARTITION. Co zatem ucina sumę do raptem jednego wiersza z wartością 30?

A propos "jednego wiersza z wartością 30"... trochę niefortunnie się
wyraziłem, mam na myśli, że w pierwszym wierszu w kolumnie SUM_1 jest
wartość 30, która (patrząc na order by) jest watością sumy jednego wiersza
(pierwszego), który zawiera właśnie 30.

-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195453
Author: Andrzej Stróżyński
Date: Tue, 28 Nov 2017 07:15
43 lines
2609 bytes
W dniu 2017-11-27 o 22:17, Roman Tyczka pisze:
> On Mon, 27 Nov 2017 22:10:32 +0100, Andrzej Stróżyński wrote:
> 
>>>>> SELECT A, B, C,
>>>>>     SUM(C) OVER (),
>>>>>     SUM(C) OVER (ORDER BY A, B),
>>>>>     SUM(C) OVER (PARTITION BY A),
>>>>>     SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>>>     FROM TEST
>>>>>
>>>>> i wyniki:
>>>>>
>>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>>> -------------------------------------
>>>>> 1|  1|  30|  141|    30|    60|    30|
>>>>> 1|  2|  20|  141|    50|    60|    50|
>>>>> 1|  3|  10|  141|    60|    60|    60|
>>>>> 2|  1|  25|  141|    85|    40|    25|
>>>>> 2|  2|  15|  141|   100|    40|    40|
>>>>> 3|  1|  41|  141|   141|    41|    41|
>>>>>
>>>>
>>>> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
>>>> ORDER BY powoduje sumowanie narastająco.
>>>> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości
>>>> partycjonującej.
>>>
>>> czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
>>> trochę nieintuicyjne
>>
>> Odcina PARTITION BY.
>> ORDER BY decyduje o kolejności sumowania wewnątrz partycji.
>   
> Ale czekaj... kolumna SUM_1 pochodzi z SUM(C) OVER (ORDER BY A, B) a tu nie
> ma PARTITION. Co zatem ucina sumę do raptem jednego wiersza z wartością 30?

No właśnie nic tu nie ucina (nie zeruje) wyniku w trakcie sumowania.
Zaczyna od 0 i sumuje narastająco kolejne wiersze wg zadanej kolejności.


-- 
pozdrawiam
AS
Re: Funkcje WINDOW
#195454
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 09:17
75 lines
2872 bytes
On Tue, 28 Nov 2017 08:15:33 +0100, Andrzej Stróżyński wrote:

> W dniu 2017-11-27 o 22:17, Roman Tyczka pisze:
>> On Mon, 27 Nov 2017 22:10:32 +0100, Andrzej Stróżyński wrote:
>> 
>>>>>> SELECT A, B, C,
>>>>>>     SUM(C) OVER (),
>>>>>>     SUM(C) OVER (ORDER BY A, B),
>>>>>>     SUM(C) OVER (PARTITION BY A),
>>>>>>     SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>>>>     FROM TEST
>>>>>>
>>>>>> i wyniki:
>>>>>>
>>>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>>>> -------------------------------------
>>>>>> 1|  1|  30|  141|    30|    60|    30|
>>>>>> 1|  2|  20|  141|    50|    60|    50|
>>>>>> 1|  3|  10|  141|    60|    60|    60|
>>>>>> 2|  1|  25|  141|    85|    40|    25|
>>>>>> 2|  2|  15|  141|   100|    40|    40|
>>>>>> 3|  1|  41|  141|   141|    41|    41|
>>>>>>
>>>>>
>>>>> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
>>>>> ORDER BY powoduje sumowanie narastająco.
>>>>> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości
>>>>> partycjonującej.
>>>>
>>>> czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
>>>> trochę nieintuicyjne
>>>
>>> Odcina PARTITION BY.
>>> ORDER BY decyduje o kolejności sumowania wewnątrz partycji.
>>   
>> Ale czekaj... kolumna SUM_1 pochodzi z SUM(C) OVER (ORDER BY A, B) a tu nie
>> ma PARTITION. Co zatem ucina sumę do raptem jednego wiersza z wartością 30?
> 
> No właśnie nic tu nie ucina (nie zeruje) wyniku w trakcie sumowania.
> Zaczyna od 0 i sumuje narastająco kolejne wiersze wg zadanej kolejności.

Ok, to ma sens, ale w takim razie gdy zrobiłem jak prosiłeś order by C i
wyszło:

10
30
60
15
40
41

to jak to powstało?
kolumna C posortowana wygląda tak:

10
15
20
25
30
41

zatem narastająca suma powinna wyjść:

10
25
45
70
100
141

czyli inaczej, skąd ta różnica?

-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195455
Author: Andrzej Stróżyński
Date: Tue, 28 Nov 2017 10:13
92 lines
3831 bytes
W dniu 2017-11-28 o 10:17, Roman Tyczka pisze:
> On Tue, 28 Nov 2017 08:15:33 +0100, Andrzej Stróżyński wrote:
> 
>> W dniu 2017-11-27 o 22:17, Roman Tyczka pisze:
>>> On Mon, 27 Nov 2017 22:10:32 +0100, Andrzej Stróżyński wrote:
>>>
>>>>>>> SELECT A, B, C,
>>>>>>>      SUM(C) OVER (),
>>>>>>>      SUM(C) OVER (ORDER BY A, B),
>>>>>>>      SUM(C) OVER (PARTITION BY A),
>>>>>>>      SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>>>>>      FROM TEST
>>>>>>>
>>>>>>> i wyniki:
>>>>>>>
>>>>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>>>>> -------------------------------------
>>>>>>> 1|  1|  30|  141|    30|    60|    30|
>>>>>>> 1|  2|  20|  141|    50|    60|    50|
>>>>>>> 1|  3|  10|  141|    60|    60|    60|
>>>>>>> 2|  1|  25|  141|    85|    40|    25|
>>>>>>> 2|  2|  15|  141|   100|    40|    40|
>>>>>>> 3|  1|  41|  141|   141|    41|    41|
>>>>>>>
>>>>>>
>>>>>> Wnioskuję wyłącznie z obserwacji Twojego wyniku:
>>>>>> ORDER BY powoduje sumowanie narastająco.
>>>>>> SUM_3 jest partycjonowane więc licznik zeruje się przy zmianie wartości
>>>>>> partycjonującej.
>>>>>
>>>>> czyli ORDER BY odcina z sumy wiersze, to dość nieoczywiste dla mnie i
>>>>> trochę nieintuicyjne
>>>>
>>>> Odcina PARTITION BY.
>>>> ORDER BY decyduje o kolejności sumowania wewnątrz partycji.
>>>    
>>> Ale czekaj... kolumna SUM_1 pochodzi z SUM(C) OVER (ORDER BY A, B) a tu nie
>>> ma PARTITION. Co zatem ucina sumę do raptem jednego wiersza z wartością 30?
>>
>> No właśnie nic tu nie ucina (nie zeruje) wyniku w trakcie sumowania.
>> Zaczyna od 0 i sumuje narastająco kolejne wiersze wg zadanej kolejności.
> 
> Ok, to ma sens, ale w takim razie gdy zrobiłem jak prosiłeś order by C i
> wyszło:
> 
> 10
> 30
> 60
> 15
> 40
> 41
> 
> to jak to powstało?
> kolumna C posortowana wygląda tak:
> 
> 10
> 15
> 20
> 25
> 30
> 41
> 
> zatem narastająca suma powinna wyjść:
> 
> 10
> 25
> 45
> 70
> 100
> 141
> 
> czyli inaczej, skąd ta różnica?

z PARTITION BY A, które po pierwsze, niejawnie, wymusza najpierw order 
by A, po drugie, zeruje sumę przy zmianie wartości A.
(PARTITION BY A ORDER BY C) daje kolejność jak ORDER BY A, C
czyli mamy:

A  B   C	SUM
1  3  10	 10
1  2  20	+20=30
1  1  30	+30=60
2  2  15	 15	-> zmiana wartości A więc zaczynamy od 0
2  1  25	+25=40
3  1  41	 41	-> zmiana wartości A więc zaczynamy od 0

i wszystko się zgadza.


-- 
pozdrawiam
AS
Re: Funkcje WINDOW
#195456
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 10:41
56 lines
2471 bytes
On Tue, 28 Nov 2017 11:13:31 +0100, Andrzej Stróżyński wrote:

>>>>>>>> SELECT A, B, C,
>>>>>>>>      SUM(C) OVER (),
>>>>>>>>      SUM(C) OVER (ORDER BY A, B),
>>>>>>>>      SUM(C) OVER (PARTITION BY A),
>>>>>>>>      SUM(C) OVER (PARTITION BY A ORDER BY B)
>>>>>>>>      FROM TEST
>>>>>>>>
>>>>>>>> i wyniki:
>>>>>>>>
>>>>>>>> A|  B|   C|  SUM| SUM_1| SUM_2| SUM_3|
>>>>>>>> -------------------------------------
>>>>>>>> 1|  1|  30|  141|    30|    60|    30|
>>>>>>>> 1|  2|  20|  141|    50|    60|    50|
>>>>>>>> 1|  3|  10|  141|    60|    60|    60|
>>>>>>>> 2|  1|  25|  141|    85|    40|    25|
>>>>>>>> 2|  2|  15|  141|   100|    40|    40|
>>>>>>>> 3|  1|  41|  141|   141|    41|    41|
>>>>>>>>

> z PARTITION BY A, które po pierwsze, niejawnie, wymusza najpierw order 
> by A, po drugie, zeruje sumę przy zmianie wartości A.
> (PARTITION BY A ORDER BY C) daje kolejność jak ORDER BY A, C
> czyli mamy:
> 
> A  B   C	SUM
> 1  3  10	 10
> 1  2  20	+20=30
> 1  1  30	+30=60
> 2  2  15	 15	-> zmiana wartości A więc zaczynamy od 0
> 2  1  25	+25=40
> 3  1  41	 41	-> zmiana wartości A więc zaczynamy od 0
> 
> i wszystko się zgadza.

Ok, dzięki, to teraz jeszcze to:

 SUM(C) OVER (ORDER BY C),

daje:
10
45
100
25
70
141

Skąd takie wyniki?

Obrazek, żeby było łatwiej: 
http://snap.ashampoo.com/uploads/2017-11-28/kewaJyYM.png

-- 
pozdrawiam
Roman Tyczka
Re: Funkcje WINDOW
#195457
Author: irq
Date: Tue, 28 Nov 2017 16:14
1 lines
1922 bytes
Wierzę, że w uchwyceniu i usystematyzowaniu wiedzy o funkcjach okienkowych może pomóc lektura tego zasobu: http://momjian.us/main/writings/pgsql/window.pdf. Nie powinno mieć znaczenia, że tekst dotyczy Postgresa, przynajmniej w podstawowym zakresie.
Re: Funkcje WINDOW
#195458
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 17:59
15 lines
1878 bytes
On Tue, 28 Nov 2017 08:14:40 -0800 (PST), irq wrote:

> Wierzę, że w uchwyceniu i usystematyzowaniu wiedzy o funkcjach okienkowych może pomóc lektura tego zasobu: http://momjian.us/main/writings/pgsql/window.pdf. Nie powinno mieć znaczenia, że tekst dotyczy Postgresa, przynajmniej w podstawowym zakresie.

Dzięki, w pierwszej chwili mnie to przytłoczyło, ale jak się nad tym poduma
to zaczynają się pojawiać przebłyski.
W każdym razie z tym order by już wiem, że to działa tak, że brany jest pod
uwagę zakres od "unbounded preceding to current row" co dokładnie odpowiada
wynikom mojego ostatniego pytania.
Ale jest to trochę mimo wszystko zamotane... niemniej daje naprawdę ciekawe
możliwości.

-- 
pozdrawiam
Roman Tyczka
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads