Czy ktoś może wyjaśnić, co partition by
robi słowo kluczowe, i podać prosty przykład tego działania, a także dlaczego warto go użyć? Mam zapytanie SQL napisane przez kogoś innego i staram się dowiedzieć, co on robi.
Przykład partycji według:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Przykłady, które widziałem w Internecie, wydają się zbyt dogłębne.
sql
oracle
window-functions
Alex Beardsley
źródło
źródło
Odpowiedzi:
PARTITION BY
Klauzula określa zakres rekordów, które będą używane dla każdego „grupa” wOVER
klauzuli.W twoim przykładzie SQL
DEPT_COUNT
zwraca liczbę pracowników w tym dziale dla każdego rekordu pracownika. (To tak, jakby cofnąć nominalizacjęemp
stołu; nadal zwracasz każdy rekord wemp
tabeli).Gdyby istniała inna kolumna (np.
state
), Możesz policzyć, ile departamentów w tym stanie.To jak uzyskiwanie wyników
GROUP BY
(SUM
,AVG
itp.) Bez agregowania zestawu wyników (tj. Usuwania pasujących rekordów).Jest to przydatne, gdy używasz funkcji
LAST OVER
lub,MIN OVER
aby na przykład uzyskać najniższą i najwyższą pensję w dziale, a następnie użyć jej w obliczeniach w stosunku do tej pensji bez subselekcji, co jest znacznie szybsze.Przeczytaj link do artykułu AskTom, aby uzyskać więcej informacji.
źródło
last over
imin over
. Wyobrażam sobie, że wybór podrzędny byłby wolniejszy, ale gramatyka angielska w odpowiedzi nie sugeruje tego.Koncepcja jest bardzo dobrze wyjaśniona przez przyjętą odpowiedź, ale uważam, że im więcej widzisz, tym lepiej się w nim zatapia. Oto przykład przyrostowy:
1) Szef mówi „zdobądź dla mnie liczbę artykułów w magazynie pogrupowanych według marki”
Mówisz : „bez problemu”
Wynik:
2) Szef mówi „Teraz podaj mi listę wszystkich produktów, wraz z ich marką ORAZ liczbą przedmiotów, które posiada dana marka”
Możesz spróbować:
Ale dostajesz:
Oto, co
OVER (PARTITION BY BRAND)
przychodzi:Które oznacza:
COUNT(ITEM_ID)
- uzyskać liczbę przedmiotówOVER
- Nad zestawem rzędów(PARTITION BY BRAND)
- które mają tę samą markęRezultat to:
itp...
źródło
Jest to rozszerzenie SQL o nazwie analityka. „Over” w instrukcji select mówi wyroczni, że funkcja jest funkcją analityczną, a nie grupą według funkcji. Zaletą korzystania z analityki jest to, że można zbierać sumy, liczby i wiele więcej za pomocą tylko jednego przejścia danych zamiast zapętlania danych za pomocą subselekcji lub, co gorsza, PL / SQL.
Z początku wydaje się to mylące, ale szybko stanie się drugą naturą. Nikt nie wyjaśnia tego lepiej niż Tom Kyte. Powyższy link jest świetny.
Oczywiście czytanie dokumentacji jest koniecznością.
źródło
Tutaj zaczynamy liczyć na odpowiednie deptno. Jeśli chodzi o deptno 10, mamy 4 rekordy w tabeli emp podobne wyniki dla deptno 20 i 30 również.
źródło
słowo kluczowe ponad partycją jest tak, jakbyśmy partycjonowali dane, tworząc identyfikator_klienta podzbiorem każdego identyfikatora klienta
to zapytanie zwróci liczbę operacji wykonanych przez identyfikator_klienta
źródło
Myślę, że ten przykład sugeruje niewielki niuans dotyczący sposobu partycjonowania i sposobu grupowania według. Mój przykład pochodzi z Oracle 12, jeśli mój przykład jest błędem kompilacyjnym.
Próbowałem :
Działa to jednak zgodnie z oczekiwaniami:
Wytwarzanie liczby elementów w każdym stanie na podstawie klucza zewnętrznego „data_key”. Jeśli więc data_key = „APPLE” miał 3 wiersze ze stanem „A”, 2 wiersze ze stanem „B”, wiersz ze stanem „C”, odpowiadający wiersz dla „APPLE” to „APPLE”, 3, 2 , 1, 6.
źródło