Window Functions: Ginger Grant
Window Functions: Ginger Grant
I N T E R M E D I AT E S Q L S E R V E R
Ginger Grant
Instructor
INTERMEDIATE SQL SERVER
Grouping data in T-SQL
SELECT SalesPerson, SalesYear,
CurrentQuota, ModifiedDate
FROM SaleGoal
WHERE SalesYear = 2011
+------------+----------+---------------+----------------+
|SalesPerson |SalesYear | CurrentQuota | ModifiedDate |
+------------+----------+---------------+----------------+
| Bob | 2011 | 28000.00 | 2011-04-16 |
| Bob | 2011 | 7000.00 | 2011-07-16 |
| Bob | 2011 | 91000.00 | 2011-10-16 |
| Mary | 2011 |367000.00 | 2011-04-16 |
| Mary | 2011 |556000.00 | 2011-07-16 |
| Mary | 2011 |502000.00 | 2011-10-16 |
+------------+----------+---------------+----------------+
. . .
-- Create a Window data grouping
OVER (PARTITION BY SalesYear ORDER BY SalesYear)
+------------+----------+-------------+------------+----------+
|SalesPerson |SalesYear |CurrentQuota |YearlyTotal | ModDate |
+------------+----------+-------------+------------+----------+
|Bob |2011 |28000.00 |1551000.00 |2011-04-16|
|Bob |2011 |7000.00 |1551000.00 |2011-07-17|
|Mary |2011 |367000.00 |1551000.00 |2011-04-16|
|Mary |2011 |556000.00 |1551000.00 |2011-07-15|
|Bob |2012 |70000.00 |1859000.00 |2012-01-15|
|Bob |2012 |154000.00 |1859000.00 |2012-04-16|
|Bob |2012 |107000.00 |1859000.00 |2012-07-16|
... | | | | |
+------------+----------+-------------+------------+----------+
+------------+----------+------------+--------------+----------+
|SalesPerson |SalesYear |CurrentQuota|QuotaPerYear | ModDate |
+------------+----------+------------+--------------+----------+
|Bob |2011 |28000.00 |4 |2011-04-16|
|Bob |2011 |7000.00 |4 |2011-07-17|
|Mary |2011 |367000.00 |4 |2011-04-16|
|Mary |2011 |556000.00 |4 |2011-07-15|
|Bob |2012 |70000.00 |8 |2012-01-15|
|Bob |2012 |154000.00 |8 |2012-04-15|
|Bob |2012 |107000.00 |8 |2012-10-16|
...
+------------+----------+------------+------------+----------+
Notice the count starts over for each window in column QuotaPerYear
Ginger Grant
Instructor
FIRST_VALUE() and LAST_VALUE()
FIRST_VALUE() returns the rst value in the window
+------------+----------+------------+------------+----------+
|SalesPerson |SalesYear |CurrentQuota|NextQuota | ModDate |
+------------+----------+------------+------------+----------+
|Bob |2011 |28000.00 |367000.00 |2011-04-15|
|Mary |2011 |367000.00 |556000.00 |2011-04-16|
|Mary |2011 |556000.00 |7000.00 |2011-07-15|
|Bob |2011 |7000.00 |NULL |2011-07-17|
|Bob |2012 |70000.00 |502000.00 |2012-01-15|
|Mary |2012 |502000.00 |154000.00 |2012-01-16|
...
+------------+----------+------------+------------+----------+
+------------+----------+------------+-------------+----------+
|SalesPerson |SalesYear |CurrentQuota|PreviousQuota |ModDate |
+------------+----------+------------+-------------+----------+
|Bob |2011 |28000.00 |NULL |2011-04-15|
|Mary |2011 |367000.00 |28000.00 |2011-04-16|
|Mary |2011 |556000.00 |367000.00 |2011-07-15|
|Bob |2011 |7000.00.00 |556000.00 |2011-07-17|
|Bob |2012 |7000.00 |NULL |2012-01-15|
|Mary |2012 |502000.00 |7000.00 |2012-01-16|
...
+------------+----------+------------+------------+----------+
Ginger Grant
Instructor
Reviewing aggregations
SELECT SalesPerson, SalesYear, CurrentQuota,
SUM(CurrentQuota)
OVER (PARTITION BY SalesYear) AS YearlyTotal,
ModifiedDate as ModDate
FROM SaleGoal
+------------+----------+------------+------------+----------+
|SalesPerson |SalesYear |CurrentQuota|YearlyTotal | ModDate |
+------------+----------+------------+------------+----------+
|Bob |2011 |28000.00 |1551000.00 |2011-04-16|
|Bob |2011 |7000.00 |1551000.00 |2011-07-17|
|Bob |2011 |91000.00 |1551000.00 |2011-10-17|
|Mary |2011 |140000.00 |1551000.00 |2012-04-15|
|Mary |2011 |70000.00 |1551000.00 |2012-07-15|
|Mary |2011 |154000.00 |1551000.00 |2012-01-15|
|Mary |2012 |107000.00 |1859000.00 |2012-01-16|
...
+------------+----------+------------+------------+----------+
+------------+----------+------------+------------+----------+
|SalesPerson |SalesYear |CurrentQuota|YearTotal | ModDate |
+------------+----------+------------+------------+----------+
|Bob |2011 |28000.00 |35000.00 |2011-04-16|
|Bob |2011 |7000.00 |35000.00 |2011-07-17|
|Mary |2011 |367000.00 |958000.00 |2011-10-17|
|Mary |2011 |556000.00 |958000.00 |2012-04-15|
|Bob |2012 |70000.00 |401000.00 |2012-07-15|
|Bob |2012 |154000.00 |401000.00 |2012-10-16|
...
+------------+----------+------------+------------+----------+
+------------+----------+------------+------------+----------+
|SalesPerson |SalesYear |CurrentQuota|RunningTotal| ModDate |
+------------+----------+------------+------------+----------+
|Bob |2011 |28000.00 |28000.00 |2011-04-16|
|Mary |2011 |367000.00 |395000.00 |2011-07-17|
|Mary |2011 |556000.00 |951000.00 |2011-10-17|
|Bob |2011 |7000.00 |958000.00 |2012-04-15|
|Bob |2012 |70000.00 |70000.00 |2012-01-15|
|Mary |2012 |502000.00 |572000.00 |2012-01-16|
...
+------------+----------+------------+------------+----------+
+------------+----------+------------+------------------+
|SalesPerson |SalesYear |CurrentQuota|QuotabySalesPerson|
+------------+----------+------------+------------------+
|Bob |2011 |28000.00 |1 |
|Bob |2011 |7000.00 |2 |
|Bob |2011 |70000.00 |3 |
|Bob |2011 |154000.00 |4 |
|Bob |2012 |70000.00 |5 |
|Bob |2012 |107000.00 |6 |
|Bob |2012 |91000.00 |7 |
|Mary |2011 |367000.00 |1 |
...
+------------+----------+------------+------------------+
Ginger Grant
Instructor
Calculating the standard deviation
Calculate standard deviation either for the entire table or for each window
+------------+----------+------------+-----------------+----------+
|SalesPerson |SalesYear |CurrentQuota|StandardDev | ModDate |
+------------+----------+------------+-----------------+----------+
|Bob |2011 |28000.00 |267841.370964233 |2011-04-16|
|Bob |2011 |7000.00 |267841.370964233 |2011-07-17|
|Bob |2011 |91000.00 |267841.370964233 |2011-10-17|
|Bob |2012 |140000.00 |267841.370964233 |2012-01-15|
|Bob |2012 |70000.00 |267841.370964233 |2012-04-15|
...
+------------+----------+------------+-------------+----------+
|SalesPerson |SalesYear |CurrentQuota|StDev | ModDate |
+------------+----------+------------+-------------+----------+
|Bob |2011 |28000.00 |267841.54080 |2011-04-16|
|Bob |2011 |7000.00 |267841.54080 |2011-07-17|
|Mary |2011 |91000.00 |267841.54080 |2011-04-16|
|Mary |2011 |140000.00 |267841.54080 |2011-07-15|
|Bob |2012 |70000.00 |246538.86248 |2012-01-15|
|Bob |2012 |154000.00 |246538.86248 |2012-04-15|
|Bob |2012 |107000.00 |246538.86248 |2012-07-16|
...
+------------+----------+------------+------------+-----------+
To calculate mode:
Create a CTE containing an ordered count of values using ROW_NUMBER
Write a query using the CTE to pick the value with the highest row number
+------------+----------+------------+-------------+
|SalesPerson |SalesYear |CurrentQuota|QuotaList |
+------------+----------+------------+-------------+
|Bob |2011 |7000.00 |1 |
|Bob |2011 |28000.00 |1 |
|Bob |2011 |70000.00 |1 |
|Bob |2012 |70000.00 |2 |
|Mary |2012 |73000.00 |1 |
...
+------------+----------+------------+-------------+
+------------+----------+
|CurrentQuota|Mode |
+------------+----------+
|70000.00 |2 |
+------------+----------+