sql >> Databasteknik >  >> RDS >> Sqlserver

SQL OVER()-satsen - när och varför är den användbar?

Du kan använd GROUP BY SalesOrderID . Skillnaden är att med GROUP BY kan du bara ha de aggregerade värdena för de kolumner som inte ingår i GROUP BY.

Om du däremot använder fönsterade aggregerade funktioner istället för GROUP BY kan du hämta både aggregerade och icke-aggregerade värden. Det vill säga, även om du inte gör det i din exempelfråga, kan du hämta både individuella OrderQty värden och deras summor, antal, medelvärden etc. över grupper av samma SalesOrderID s.

Här är ett praktiskt exempel på varför fönstermaterial är bra. Anta att du behöver beräkna hur stor procent av en total varje värde är. Utan fönsterade aggregat måste du först härleda en lista med aggregerade värden och sedan koppla tillbaka den till den ursprungliga raduppsättningen, dvs så här:

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]

Titta nu på hur du kan göra samma sak med ett fönsterformat aggregat:

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

Mycket enklare och renare, eller hur?



  1. Hur kommer det sig att sqlplus inte ansluter?

  2. CONVERT() från datum/tid till strängexempel i SQL Server

  3. Assembly 'Microsoft.SqlServer.Types' version 10 eller högre kunde inte hittas

  4. Postgres SSL SYSCALL-fel:EOF upptäckt med python och psycopg