Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Klauzula SQL OVER() - kiedy i dlaczego jest przydatna?

możesz użyj GROUP BY SalesOrderID . Różnica polega na tym, że dzięki funkcji GROUP BY możesz mieć tylko zagregowane wartości dla kolumn, które nie są zawarte w GROUP BY.

W przeciwieństwie do tego, używając okienkowych funkcji agregujących zamiast funkcji GROUP BY, można pobrać zarówno wartości zagregowane, jak i niezagregowane. Oznacza to, że chociaż nie robisz tego w przykładowym zapytaniu, możesz pobrać zarówno pojedyncze OrderQty wartości i ich sumy, liczby, średnie itp. w grupach o tym samym SalesOrderID s.

Oto praktyczny przykład tego, dlaczego agregaty okienkowe są świetne. Załóżmy, że musisz obliczyć, jaki procent sumy stanowi każda wartość. Bez agregacji okienkowych musiałbyś najpierw utworzyć listę zagregowanych wartości, a następnie dołączyć ją z powrotem do oryginalnego zestawu wierszy, tj. tak:

SELECT
  orig.[Partition],
  orig.Value,
  orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
  INNER JOIN (
    SELECT
      [Partition],
      SUM(Value) AS TotalValue
    FROM OriginalRowset
    GROUP BY [Partition]
  ) agg ON orig.[Partition] = agg.[Partition]

Teraz spójrz, jak możesz zrobić to samo z agregatem okienkowym:

SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

O wiele łatwiej i czyściej, prawda?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie są ograniczenia programu SQL Server Compact? (Lub - jak wybrać bazę danych do użycia na platformach MS?)

  2. Dowiedz się, jak odzyskać usuniętą tabelę w SQL Server 2012 bez kopii zapasowej

  3. Polecenie SQL INSERT działa, ale dane nie pojawiają się w tabeli

  4. Jak naprawić błąd 926 Microsoft SQL Server? — Rozwiązany

  5. Kolumny daty w SQL-Server (MSSQL-JDBC 3.0) działające w środowisku Java 1.7.0 pobrane jako 2 dni w przeszłości