SQL
1 Introduction to SQL
1.1 Overview of SQL
1.2 History and Evolution of SQL
1.3 Importance of SQL in Data Management
2 SQL Basics
2.1 SQL Syntax and Structure
2.2 Data Types in SQL
2.3 SQL Statements: SELECT, INSERT, UPDATE, DELETE
2.4 SQL Clauses: WHERE, ORDER BY, GROUP BY, HAVING
3 Working with Databases
3.1 Creating and Managing Databases
3.2 Database Design Principles
3.3 Normalization in Database Design
3.4 Denormalization for Performance
4 Tables and Relationships
4.1 Creating and Modifying Tables
4.2 Primary and Foreign Keys
4.3 Relationships: One-to-One, One-to-Many, Many-to-Many
4.4 Joins: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
5 Advanced SQL Queries
5.1 Subqueries and Nested Queries
5.2 Common Table Expressions (CTEs)
5.3 Window Functions
5.4 Pivoting and Unpivoting Data
6 Data Manipulation and Aggregation
6.1 Aggregate Functions: SUM, COUNT, AVG, MIN, MAX
6.2 Grouping and Filtering Aggregated Data
6.3 Handling NULL Values
6.4 Working with Dates and Times
7 Indexing and Performance Optimization
7.1 Introduction to Indexes
7.2 Types of Indexes: Clustered, Non-Clustered, Composite
7.3 Indexing Strategies for Performance
7.4 Query Optimization Techniques
8 Transactions and Concurrency
8.1 Introduction to Transactions
8.2 ACID Properties
8.3 Transaction Isolation Levels
8.4 Handling Deadlocks and Concurrency Issues
9 Stored Procedures and Functions
9.1 Creating and Executing Stored Procedures
9.2 User-Defined Functions
9.3 Control Structures in Stored Procedures
9.4 Error Handling in Stored Procedures
10 Triggers and Events
10.1 Introduction to Triggers
10.2 Types of Triggers: BEFORE, AFTER, INSTEAD OF
10.3 Creating and Managing Triggers
10.4 Event Scheduling in SQL
11 Views and Materialized Views
11.1 Creating and Managing Views
11.2 Uses and Benefits of Views
11.3 Materialized Views and Their Use Cases
11.4 Updating and Refreshing Views
12 Security and Access Control
12.1 User Authentication and Authorization
12.2 Role-Based Access Control
12.3 Granting and Revoking Privileges
12.4 Securing Sensitive Data
13 SQL Best Practices and Standards
13.1 Writing Efficient SQL Queries
13.2 Naming Conventions and Standards
13.3 Documentation and Code Comments
13.4 Version Control for SQL Scripts
14 SQL in Real-World Applications
14.1 Integrating SQL with Programming Languages
14.2 SQL in Data Warehousing
14.3 SQL in Big Data Environments
14.4 SQL in Cloud Databases
15 Exam Preparation
15.1 Overview of the Exam Structure
15.2 Sample Questions and Practice Tests
15.3 Time Management Strategies
15.4 Review and Revision Techniques
5 3 Window Functions Explained

3 Window Functions Explained

Window functions in SQL are powerful tools that allow you to perform calculations across a set of table rows that are somehow related to the current row. Unlike aggregate functions, window functions do not cause rows to become grouped into a single output row. Instead, the rows retain their separate identities, making them ideal for complex data analysis tasks.

Key Concepts

  1. OVER Clause
  2. PARTITION BY Clause
  3. ORDER BY Clause
  4. Frame Clause
  5. Common Window Functions

1. OVER Clause

The OVER clause is used to define a window of rows around the current row. This window can be used with aggregate functions to perform calculations without collapsing the result set into a single row.

Example:

SELECT 
    EmployeeID, 
    Department, 
    Salary,
    AVG(Salary) OVER () AS AvgSalary
FROM 
    Employees;
    

In this example, the AVG(Salary) OVER () calculates the average salary across all rows without grouping them.

2. PARTITION BY Clause

The PARTITION BY clause is used within the OVER clause to divide the result set into partitions. The window function is then applied to each partition separately.

Example:

SELECT 
    EmployeeID, 
    Department, 
    Salary,
    AVG(Salary) OVER (PARTITION BY Department) AS DeptAvgSalary
FROM 
    Employees;
    

Here, the AVG(Salary) OVER (PARTITION BY Department) calculates the average salary for each department separately.

3. ORDER BY Clause

The ORDER BY clause within the OVER clause is used to specify the order of rows within each partition. This is particularly useful for functions that depend on the order of rows, such as ROW_NUMBER() or RANK().

Example:

SELECT 
    EmployeeID, 
    Department, 
    Salary,
    ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS SalaryRank
FROM 
    Employees;
    

In this example, the ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) assigns a unique rank to each employee within their department based on their salary.

4. Frame Clause

The frame clause is used to define a subset of rows within the partition. This allows for more granular control over the rows that are included in the window function calculation.

Example:

SELECT 
    EmployeeID, 
    Department, 
    Salary,
    SUM(Salary) OVER (PARTITION BY Department ORDER BY Salary ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS RollingSum
FROM 
    Employees;
    

Here, the SUM(Salary) OVER (PARTITION BY Department ORDER BY Salary ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) calculates the sum of the current row's salary plus the salaries of the preceding and following rows within the same department.

5. Common Window Functions

There are several common window functions that can be used with the OVER clause:

Example:

SELECT 
    EmployeeID, 
    Department, 
    Salary,
    ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS SalaryRank,
    RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS SalaryRankWithGaps,
    DENSE_RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS SalaryRankWithoutGaps,
    NTILE(4) OVER (PARTITION BY Department ORDER BY Salary DESC) AS SalaryQuartile,
    LAG(Salary, 1) OVER (PARTITION BY Department ORDER BY Salary DESC) AS PreviousSalary,
    LEAD(Salary, 1) OVER (PARTITION BY Department ORDER BY Salary DESC) AS NextSalary
FROM 
    Employees;
    

This example demonstrates the use of multiple window functions to analyze salary data within each department.

Understanding and mastering window functions can significantly enhance your ability to perform complex data analysis tasks in SQL, making your queries more efficient and powerful.