Thread View: pl.comp.bazy-danych
14 messages
14 total messages
Started by Roman Tyczka
Mon, 27 Nov 2017 19:05
Funkcje WINDOW
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 19:05
Date: Mon, 27 Nov 2017 19:05
29 lines
1487 bytes
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
Author: wloochacz
Date: Mon, 27 Nov 2017 20:01
Date: Mon, 27 Nov 2017 20:01
9 lines
1303 bytes
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
Author: Andrzej Stróżyński
Date: Mon, 27 Nov 2017 20:23
Date: Mon, 27 Nov 2017 20:23
37 lines
2222 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:40
Date: Mon, 27 Nov 2017 20:40
11 lines
1064 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 20:51
Date: Mon, 27 Nov 2017 20:51
42 lines
1842 bytes
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
Author: Andrzej Stróżyński
Date: Mon, 27 Nov 2017 21:10
Date: Mon, 27 Nov 2017 21:10
49 lines
2280 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:17
Date: Mon, 27 Nov 2017 21:17
39 lines
2134 bytes
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
Author: Roman Tyczka
Date: Mon, 27 Nov 2017 21:25
Date: Mon, 27 Nov 2017 21:25
17 lines
1574 bytes
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
Author: Andrzej Stróżyński
Date: Tue, 28 Nov 2017 07:15
Date: Tue, 28 Nov 2017 07:15
43 lines
2609 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 09:17
Date: Tue, 28 Nov 2017 09:17
75 lines
2872 bytes
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
Author: Andrzej Stróżyński
Date: Tue, 28 Nov 2017 10:13
Date: Tue, 28 Nov 2017 10:13
92 lines
3831 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 10:41
Date: Tue, 28 Nov 2017 10:41
56 lines
2471 bytes
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
Author: irq
Date: Tue, 28 Nov 2017 16:14
Date: Tue, 28 Nov 2017 16:14
1 lines
1922 bytes
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
Author: Roman Tyczka
Date: Tue, 28 Nov 2017 17:59
Date: Tue, 28 Nov 2017 17:59
15 lines
1878 bytes
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