SQL - WINDOW - FUNCTIONS
SQL - WINDOW - FUNCTIONS
SELECT
p.BrandName AS Brand,
c.ChannelName AS Channel,
SUM(f.SalesAmount) AS Sales
FROM FactSales AS f INNER JOIN DimProduct AS p ON f.ProductKey=p.ProductKey
INNER JOIN DimChannel AS c ON f.channelKey=c.ChannelKey
GROUP BY p.BrandName, c.ChannelName
--Approach-1
-------------
SELECT p.BrandName AS Brand, c.ChannelName AS Channel, SUM(t.Sales) AS Sales FROM (
SELECT
ChannelKey,
ProductKey,
SUM(SalesAmount) AS Sales
FROM FactSales
GROUP BY
ChannelKey,
ProductKey
) AS t INNER JOIN DimProduct AS p ON t.ProductKey=p.ProductKey
INNER JOIN DimChannel AS c ON t.channelKey=c.ChannelKey
GROUP BY p.BrandName, c.ChannelName
--Approach-2
-------------
;WITH cte1 AS (
SELECT
ChannelKey,
ProductKey,
SUM(SalesAmount) AS Sales
FROM FactSales
GROUP BY
ChannelKey,
ProductKey
)
SELECT p.BrandName AS Brand, c.ChannelName AS Channel, SUM(cte1.Sales) AS Sales FROM
cte1
INNER JOIN DimProduct AS p ON cte1.ProductKey=p.ProductKey
INNER JOIN DimChannel AS c ON cte1.channelKey=c.ChannelKey
GROUP BY p.BrandName, c.ChannelName
/*
**************************************************************************************
*********************
Window
Functions
**************************************************************************************
*********************
ROW_NUMBER(): It is used to generate sequence numbers by partition or without
partition
RANK(): It is used to generate rank. After completion of repeated number, rank() will
take row number.
DENSE_RANK(): It is used to generate rank. It will not take row number, after
completion of repeated number
*/
USE SOURCE
--Feed employee data into employees table
--Approach-1
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY DepartmentNo ORDER BY EmployeeNo) AS
Rn
FROM employees
) t
--Approach-2
;WITH cte5 AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY DepartmentNo ORDER BY EmployeeNo) AS
Rn
FROM employees
)
SELECT * FROM cte5
--Write a SQL statement to get only unique records by using SELECT in place of table
name and CTE
--Approach-1
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY EmployeeNo ORDER BY EmployeeNo) AS Rn
FROM employees
) t WHERE Rn=1
--Approach-2
;WITH cte5 AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY EmployeeNo ORDER BY EmployeeNo) AS Rn
FROM employees
)
SELECT * FROM cte5
WHERE Rn=1
--Approach-2
;WITH cte6 AS (
SELECT *, DENSE_RANK() OVER( ORDER BY Salary DESC) AS Rnk FROM employees
)
SELECT * FROM cte6 WHERE Rnk=1
--Approach-2