🚀 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 20:05
Funkcje WINDOW
#188577
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:05
28 lines
752 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
#188578
Author: wloochacz
Date: Mon, 27 Nov 2017 21:01
8 lines
231 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
#188579
Author: =?UTF-8?B?QW5kcn
Date: Mon, 27 Nov 2017 21:23
36 lines
1082 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
#188580
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:40
10 lines
254 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
#188581
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:51
41 lines
1000 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
#188582
Author: =?UTF-8?B?QW5kcn
Date: Mon, 27 Nov 2017 22:10
48 lines
1199 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
#188583
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 22:17
38 lines
1220 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
#188584
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 22:25
16 lines
650 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
#188589
Author: irq
Date: Tue, 28 Nov 2017 08:14
3 lines
285 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
#188585
Author: =?UTF-8?B?QW5kcn
Date: Tue, 28 Nov 2017 08:15
42 lines
1448 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
#188586
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 10:17
74 lines
1846 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
#188587
Author: =?UTF-8?B?QW5kcn
Date: Tue, 28 Nov 2017 11:13
91 lines
2410 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	+200
1  1  30	+30`
2  2  15	 15	-> zmiana wartości A więc zaczynamy od 0
2  1  25	+25@
3  1  41	 41	-> zmiana wartości A więc zaczynamy od 0

i wszystko się zgadza.


--
pozdrawiam
AS
Re: Funkcje WINDOW
#188588
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 11:41
55 lines
1389 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	+200
> 1  1  30	+30`
> 2  2  15	 15	-> zmiana wartości A więc zaczynamy od 0
> 2  1  25	+25@
> 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
#188590
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 18:59
14 lines
749 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