Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL OVER() клаузата – кога и защо е полезна?

Вие можете използвайте GROUP BY SalesOrderID . Разликата е, че с GROUP BY можете да имате само обобщените стойности за колоните, които не са включени в GROUP BY.

За разлика от това, като използвате прозоречни агрегатни функции вместо GROUP BY, можете да извлечете както агрегирани, така и неагрегирани стойности. Тоест, въпреки че не правите това в примерната си заявка, можете да извлечете и двата отделни OrderQty стойности и техните суми, брои, средни и т.н. върху групи от един и същ SalesOrderID с.

Ето един практически пример за това защо агрегатите с прозорци са страхотни. Да предположим, че трябва да изчислите какъв процент от общата сума е всяка стойност. Без агрегати с прозоречни агрегати първо ще трябва да извлечете списък с обобщени стойности и след това да го присъедините обратно към оригиналния набор от редове, т.е. така:

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]

Сега вижте как можете да направите същото с агрегат с прозорец:

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

Много по-лесно и по-чисто, нали?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предоставяне на потребителски достъп на msdb до пощенски профил на база данни в SQL Server (T-SQL)

  2. Намерете най-малкото неизползвано число в SQL Server

  3. MySQL - Значение на ПЪРВИЧЕН КЛЮЧ, УНИКАЛЕН КЛЮЧ и КЛЮЧ, когато се използват заедно при създаване на таблица

  4. ВЪВЕТЕ СТОЙНОСТИ, КЪДЕТО НЕ СЪЩЕСТВУВА

  5. Как да използвам променлива за името на базата данни в T-SQL?