Thread View: pl.comp.bazy-danych
14 messages
14 total messages
Started by Roman Tyczka
Mon, 27 Nov 2017 20:05
Funkcje WINDOW
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:05
Date: Mon, 27 Nov 2017 20:05
28 lines
752 bytes
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
Author: wloochacz
Date: Mon, 27 Nov 2017 21:01
Date: Mon, 27 Nov 2017 21:01
8 lines
231 bytes
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
Author: =?UTF-8?B?QW5kcn
Date: Mon, 27 Nov 2017 21:23
Date: Mon, 27 Nov 2017 21:23
36 lines
1082 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:40
Date: Mon, 27 Nov 2017 21:40
10 lines
254 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:51
Date: Mon, 27 Nov 2017 21:51
41 lines
1000 bytes
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
Author: =?UTF-8?B?QW5kcn
Date: Mon, 27 Nov 2017 22:10
Date: Mon, 27 Nov 2017 22:10
48 lines
1199 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 22:17
Date: Mon, 27 Nov 2017 22:17
38 lines
1220 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 22:25
Date: Mon, 27 Nov 2017 22:25
16 lines
650 bytes
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
Author: irq
Date: Tue, 28 Nov 2017 08:14
Date: Tue, 28 Nov 2017 08:14
3 lines
285 bytes
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
Author: =?UTF-8?B?QW5kcn
Date: Tue, 28 Nov 2017 08:15
Date: Tue, 28 Nov 2017 08:15
42 lines
1448 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 10:17
Date: Tue, 28 Nov 2017 10:17
74 lines
1846 bytes
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
Author: =?UTF-8?B?QW5kcn
Date: Tue, 28 Nov 2017 11:13
Date: Tue, 28 Nov 2017 11:13
91 lines
2410 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 11:41
Date: Tue, 28 Nov 2017 11:41
55 lines
1389 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 18:59
Date: Tue, 28 Nov 2017 18:59
14 lines
749 bytes
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