Szukaj…


Wprowadzenie

Używasz funkcji analitycznych do określania wartości na podstawie grup wartości. Na przykład możesz użyć tego typu funkcji do określenia działających sum, procentów lub najwyższego wyniku w grupie.

Składnia

  1. FIRST_VALUE (wyrażenie_skalarowe) OVER ([podział_klasy]] porządek_klasy [rzędy zakresy]
  2. LAST_VALUE (wyrażenie_skalarowe) PONAD ([podział_klucza] klauzula_klasyfikacji [klauzula_wierszy])
  3. LAG (wyrażenie_skalarne [, przesunięcie] [, domyślnie]) PONAD ([podział_klucza] porządek_klucza)
  4. OŁÓW (wyrażenie_skalarne [, przesunięcie], [domyślny]) OVER ([podział_klucza] kolejność_klucza)
  5. PERCENT_RANK () OVER ([podział_klucza] porządek_klucza)
  6. CUME_DIST () OVER ([podział_klucza] porządek_klucza)
  7. PERCENTILE_DISC (literatura_ liczbowa) W GRUPIE (ZAMÓWIENIE WEDŁUG_wyrażenia zamówienia [ASC | DESC]) OVER ([<partition_by_clause>])
  8. PERCENTILE_CONT (literatura_ liczbowa) W GRUPIE (ZAMÓWIENIE WEDŁUG_wyrażenia zamówienia [ASC | DESC]) OVER ([<partition_by_clause>])

FIRST_VALUE

Za pomocą funkcji FIRST_VALUE określa się pierwszą wartość w uporządkowanym zestawie wyników, którą identyfikuje się za pomocą wyrażenia skalarnego.

SELECT StateProvinceID, Name, TaxRate,
       FIRST_VALUE(StateProvinceID)
        OVER(ORDER BY TaxRate ASC) AS FirstValue
FROM SalesTaxRate;

W tym przykładzie funkcja FIRST_VALUE jest używana do zwracania ID stanu lub prowincji o najniższej stawce podatkowej. Klauzula OVER służy do ustalenia stawek podatkowych w celu uzyskania najniższej stawki.

StateProvinceID Nazwa Wysokość podatku FirstValue
74 Stanowy podatek od sprzedaży w stanie Utah 5,00 74
36 Stanowy podatek od sprzedaży w stanie Minnesota 6,75 74
30 Stanowy podatek od sprzedaży w stanie Massachusetts 7,00 74
1 Kanadyjski GST 7,00 74
57 Kanadyjski GST 7,00 74
63 Kanadyjski GST 7,00 74

LAST_VALUE

Funkcja LAST_VALUE zapewnia ostatnią wartość w uporządkowanym zestawie wyników, którą określasz za pomocą wyrażenia skalarnego.

SELECT TerritoryID, StartDate, BusinessentityID,
       LAST_VALUE(BusinessentityID) 
        OVER(ORDER BY TerritoryID) AS LastValue
FROM SalesTerritoryHistory;

W tym przykładzie użyto funkcji LAST_VALUE aby zwrócić ostatnią wartość dla każdego zestawu wierszy w uporządkowanych wartościach.

TerritoryID Data rozpoczęcia BusinessentityID LastValue
1 2005-07-01 00.00.00.000 280 283
1 01.11.2006 00.00.00.000 284 283
1 2005-07-01 00.00.00.000 283 283
2) 01.01.2007 00.00.00.000 277 275
2) 2005-07-01 00.00.00.000 275 275
3) 01.01.2007 00.00.00.000 275 277

LGD i OŁOWIU

Funkcja LAG dostarcza dane o wierszach przed bieżącym wierszem w tym samym zestawie wyników. Na przykład w instrukcji SELECT można porównać wartości w bieżącym wierszu z wartościami w poprzednim wierszu.

Do określenia wartości, które należy porównać, używasz wyrażenia skalarnego. Parametrem przesunięcia jest liczba wierszy przed bieżącym wierszem, które zostaną użyte w porównaniu. Jeśli nie określisz liczby wierszy, zostanie użyta wartość domyślna jednego wiersza.

Domyślny parametr określa wartość, która powinna zostać zwrócona, gdy wyrażenie z przesunięciem ma wartość NULL . Jeśli nie określisz wartości, zwracana jest wartość NULL .


Funkcja LEAD zapewnia dane dotyczące wierszy po bieżącym wierszu w zestawie wierszy. Na przykład w instrukcji SELECT można porównać wartości w bieżącym wierszu z wartościami w następnym wierszu.

Wartości należy porównać z wyrażeniem skalarnym. Parametrem przesunięcia jest liczba wierszy po bieżącym wierszu, które zostaną użyte w porównaniu.

Określ wartość, która powinna zostać zwrócona, gdy wyrażenie z przesunięciem ma wartość NULL używając parametru domyślnego. Jeśli nie określisz tych parametrów, zostanie użyta wartość domyślna jednego wiersza i zostanie zwrócona wartość NULL .

SELECT BusinessEntityID, SalesYTD,
       LEAD(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lead value",
       LAG(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lag value"
FROM SalesPerson;

W tym przykładzie użyto funkcji LEAD i LAG do porównania wartości sprzedaży dla każdego dotychczasowego pracownika z wartościami pracowników wymienionych powyżej i poniżej, z rekordami uporządkowanymi na podstawie kolumny BusinessEntityID.

BusinessEntityID SalesYTD Wartość ołowiu Wartość opóźnienia
274 559697.5639 3763178.1787 0,0000
275 3763178.1787 4251368.5497 559697.5639
276 4251368.5497 3189418.3662 3763178.1787
277 3189418.3662 1453719.4653 4251368.5497
278 1453719.4653 2315185.6110 3189418.3662
279 2315185.6110 1352577.1325 1453719.4653

PERCENT_RANK i CUME_DIST

Funkcja PERCENT_RANK oblicza ranking wiersza względem zestawu wierszy. Procent jest oparty na liczbie wierszy w grupie, które mają niższą wartość niż bieżący wiersz.

Pierwsza wartość w zestawie wyników ma zawsze rangę procentową równą zero. Wartość najwyższej lub ostatniej wartości w zestawie jest zawsze równa jeden.


Funkcja CUME_DIST oblicza względne położenie określonej wartości w grupie wartości, określając procent wartości mniejszych lub równych tej wartości. Nazywa się to rozkładem skumulowanym.

SELECT BusinessEntityID, JobTitle, SickLeaveHours,
PERCENT_RANK() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
       AS "Percent Rank",
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
       AS "Cumulative Distribution"
FROM Employee;

W tym przykładzie użyto klauzuli ORDER do podziału lub grupowania wierszy pobranych przez instrukcję SELECT na podstawie tytułów stanowisk pracowników, a wyniki w każdej grupie posortowano na podstawie liczby godzin zwolnienia lekarskiego, z których skorzystali pracownicy.

BusinessEntityID Stanowisko SickLeaveHours Stopień procentowy Komulatywna dystrybucja
267 Specjalista ds. Aplikacji 57 0 0,25
268 Specjalista ds. Aplikacji 56 0.333333333333333 0,75
269 Specjalista ds. Aplikacji 56 0.333333333333333 0,75
272 Specjalista ds. Aplikacji 55 1 1
262 Asystent Cheif Financial Officer 48 0 1
239 Specjalista ds. Świadczeń 45 0 1
252 Kupujący 50 0 0,111111111111111
251 Kupujący 49 0,125 0.333333333333333
256 Kupujący 49 0,125 0.333333333333333
253 Kupujący 48 0,375 0,555555555555555
254 Kupujący 48 0,375 0,555555555555555

Funkcja PERCENT_RANK szereguje wpisy w każdej grupie. Dla każdego wpisu zwraca procent wpisów w tej samej grupie, które mają niższe wartości.

Funkcja CUME_DIST jest podobna, z tym wyjątkiem, że zwraca procent wartości mniejszych lub równych bieżącej wartości.

PERCENTILE_DISC i PERCENTILE_CONT

Funkcja PERCENTILE_DISC wyświetla wartość pierwszego wpisu, w którym skumulowany rozkład jest wyższy niż percentyl PERCENTILE_DISC za pomocą parametru numeric_literal .

Wartości są pogrupowane według zestawu wierszy lub partycji, zgodnie z klauzulą WITHIN GROUP .


Funkcja PERCENTILE_CONT jest podobna do funkcji PERCENTILE_DISC , ale zwraca średnią sumy pierwszego pasującego wpisu i następnego wpisu.

SELECT BusinessEntityID, JobTitle, SickLeaveHours,
       CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
       AS "Cumulative Distribution",
       PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
          OVER(PARTITION BY JobTitle) AS "Percentile Discreet"
FROM Employee;

Aby znaleźć dokładną wartość z wiersza, która odpowiada lub przekracza 0,5 percentyla, przekazujesz percentyl jako literał liczbowy w funkcji PERCENTILE_DISC . Kolumna Dyskretna wartość procentowa w zestawie wyników zawiera wartość wiersza, w którym skumulowany rozkład jest wyższy niż określony percentyl.

BusinessEntityID Stanowisko SickLeaveHours Komulatywna dystrybucja Percentyl Dyskretny
272 Specjalista ds. Aplikacji 55 0,25 56
268 Specjalista ds. Aplikacji 56 0,75 56
269 Specjalista ds. Aplikacji 56 0,75 56
267 Specjalista ds. Aplikacji 57 1 56

Aby oprzeć obliczenia na zbiorze wartości, użyj funkcji PERCENTILE_CONT . Kolumna „Percentile Continuous” w wynikach zawiera średnią wartość sumy wartości wyniku i następną najwyższą pasującą wartość.

SELECT BusinessEntityID, JobTitle, SickLeaveHours,
       CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
       AS "Cumulative Distribution",
       PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours) 
          OVER(PARTITION BY JobTitle) AS "Percentile Discreet",
       PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY SickLeaveHours) 
          OVER(PARTITION BY JobTitle) AS "Percentile Continuous"
FROM Employee;
BusinessEntityID Stanowisko SickLeaveHours Komulatywna dystrybucja Percentyl Dyskretny Percentile Continuous
272 Specjalista ds. Aplikacji 55 0,25 56 56
268 Specjalista ds. Aplikacji 56 0,75 56 56
269 Specjalista ds. Aplikacji 56 0,75 56 56
267 Specjalista ds. Aplikacji 57 1 56 56


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow