Unlocking the Power of Advanced Aggregate Functions in SQL

Unlocking the Power of Advanced Aggregate Functions in SQL

Aggregate functions are fundamental in SQL, allowing you to summarize data, perform calculations, and generate reports efficiently. While basic aggregate functions like SUM(), AVG(), and COUNT() are commonly used, advanced aggregate functions provide deeper insights, greater flexibility, and enhanced control over complex queries.

In this article, we will explore advanced aggregate functions in Oracle SQL, Microsoft SQL Server (MSSQL), and PostgreSQL, covering:

  • Window Functions (ROW_NUMBER, RANK, LEAD, LAG, etc.) for row-level calculations without collapsing data.
  • GROUPING SETS for multi-level aggregation within a single query.
  • CUBE for multi-dimensional analysis across multiple grouping combinations.
  • ROLLUP for hierarchical summarization with subtotals and grand totals.
  • Advanced Filtering with FILTER (PostgreSQL-specific) to apply aggregates to specific subsets.
  • Statistical Functions (STDDEV, VARIANCE, CORR, etc.) for deeper data analysis.
  • String Aggregation (STRING_AGG, LISTAGG) for efficiently combining multiple string values.
  • Percentile and Median Calculations to analyze data distribution.
  • Advanced Analytic Functions (CUME_DIST, NTILE) for ranking and distribution analysis.
  • Pivoting and Unpivoting Data to reshape datasets dynamically.
  • Performance Optimization Strategies to ensure efficient aggregate function usage.

Each section includes detailed explanations, real-world SQL examples, expected outputs, and performance considerations, ensuring you gain a comprehensive understanding of these advanced techniques.

Let’s dive in and master the power of advanced aggregate functions in SQL! ??



1. Window Functions

Purpose:

Window functions perform calculations across a set of rows that are related to the current row. Unlike standard aggregate functions, they do not collapse multiple rows into a single output row. Instead, they allow ranking, running totals, moving averages, and row-by-row comparisons.

Common Window Functions and Their Use Cases:

  • ROW_NUMBER(): Assigns a unique row number per partition.
  • RANK(): Ranks rows, leaving gaps for duplicates.
  • DENSE_RANK(): Ranks rows without gaps.
  • NTILE(n): Distributes rows into n buckets.
  • LEAD() and LAG(): Fetch next and previous row values.
  • FIRST_VALUE() and LAST_VALUE(): Retrieve first and last value of the partition.
  • SUM() OVER(): Computes running totals.


Example 1: Using ROW_NUMBER() to Rank Employees by Salary

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    department_id, 
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num
FROM employees;        

  • This query assigns a unique row number to each employee within their department based on salary in descending order.
  • The PARTITION BY clause groups data by department_id, so each department has its own ranking sequence.
  • Higher salaries get lower row numbers.


Example 2: Using RANK() and DENSE_RANK()

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    salary,
    RANK() OVER (ORDER BY salary DESC) AS rank_position,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_position
FROM employees;
        

  • RANK(): Leaves gaps if there are duplicate salaries.
  • DENSE_RANK(): Does not leave gaps when duplicate salaries exist.


Example 3: Using LEAD() and LAG() for Salary Comparison

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    salary,
    LAG(salary) OVER (ORDER BY salary) AS prev_salary,
    LEAD(salary) OVER (ORDER BY salary) AS next_salary
FROM employees;        

  • LAG(salary): Retrieves the previous row's salary.
  • LEAD(salary): Retrieves the next row's salary.


Example 4: Running Total with SUM() OVER()

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    salary,
    SUM(salary) OVER (ORDER BY employee_id) AS running_total
FROM employees;        

  • Computes a running total by accumulating salaries row by row.
  • Useful for financial reports and cumulative analysis.


Advantages and Limitations of Window Functions

? Advantages:

  • Provide detailed row-by-row calculations without collapsing data.
  • Efficient for ranking, running totals, and comparisons.
  • Work well with reporting and analytics queries.

?? Limitations:

  • Performance-intensive on large datasets (requires indexing for optimization).
  • Not always parallelizable (can slow down complex queries).


2. GROUPING SETS

What is GROUPING SETS?

GROUPING SETS is an advanced SQL feature that allows multiple GROUP BY operations within a single query. Instead of writing separate queries for each grouping level, you can use GROUPING SETS to compute different levels of aggregation efficiently.

Why Use GROUPING SETS?

? Reduces the need for multiple GROUP BY queries.

? Improves performance by computing multiple aggregations in a single pass.

? Useful for creating reports that require different levels of summaries.

Drawbacks:

? Can be hard to read if used with too many grouping combinations.

? May increase query execution time if not optimized properly.


Example: Using GROUPING SETS in Oracle, MSSQL, and PostgreSQL

Scenario:

Suppose we have an employees table with department_id, job_id, and salary. We want to calculate:

  1. Total salary per department and job role.
  2. Total salary per department only.
  3. Total salary per job role only.
  4. Grand total salary for all employees.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    department_id, 
    job_id, 
    SUM(salary) AS total_salary
FROM employees
GROUP BY GROUPING SETS (
    (department_id, job_id), -- Group by Department and Job
    (department_id),         -- Group by Department only
    (job_id),               -- Group by Job only
    ()                      -- Grand Total
);        

What This Query Does:

? Aggregates salary at different levels of granularity.

? Returns one result set with department-wise, job-wise, and grand total salaries.

? The empty () inside GROUPING SETS represents the grand total.


3. CUBE

What is CUBE?

CUBE is an extension of GROUP BY that generates all possible combinations of groupings for the selected columns. It is often used for generating multi-dimensional reports.

Why Use CUBE?

? Automatically calculates all possible aggregations.

? Useful for generating pivot-like reports in SQL.

? Eliminates the need for writing multiple queries manually.

Drawbacks:

? Can be computationally expensive on large datasets.

? Not available in MySQL (only in Oracle, MSSQL, and PostgreSQL).


Example: Using CUBE in Oracle, MSSQL, and PostgreSQL

Scenario:

We want to calculate the total salary for all possible department and job combinations, including:

  • Salary grouped by Department and Job
  • Salary grouped by Department only
  • Salary grouped by Job only
  • Grand total salary

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    department_id, 
    job_id, 
    SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE (department_id, job_id);        

What This Query Does:

? Generates all possible combinations of department_id and job_id.

? Provides hierarchical summaries in a single query.

? Includes grand total automatically.


CUBE vs GROUPING SETS: What’s the Difference?


4. ROLLUP

What is ROLLUP?

ROLLUP is another extension of GROUP BY that generates hierarchical totals. Unlike CUBE, which considers all possible combinations, ROLLUP follows a hierarchical order, making it useful for reports with a drill-down structure.

Why Use ROLLUP?

? Efficient for creating subtotal and grand total reports.

? Useful for financial and sales reports that require hierarchical grouping.

? Better performance than CUBE when only hierarchical summaries are needed.

Drawbacks:

? Unlike CUBE, it doesn’t generate all combinations.

? Less flexible than GROUPING SETS.


Example: Using ROLLUP in Oracle, MSSQL, and PostgreSQL

Scenario:

We need a hierarchical summary of total salary:

  1. Salary per Department and Job.
  2. Total salary per Department only.
  3. Grand Total salary.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    department_id, 
    job_id, 
    SUM(salary) AS total_salary
FROM employees
GROUP BY ROLLUP (department_id, job_id);        

What This Query Does:

? Groups by Department and Job.

? Provides subtotals per Department.

? Includes Grand Total at the end.

? Unlike CUBE, does NOT generate job-wise grouping separately.


CUBE vs ROLLUP: What’s the Difference?


Summary: Choosing Between GROUPING SETS, CUBE, and ROLLUP

? GROUPING SETS allows custom grouping combinations, improving performance for selective aggregations.

? CUBE generates all possible groupings, useful for full reports but can be computationally expensive.

? ROLLUP provides hierarchical aggregation, making it useful for financial reports and drill-down data analysis.


5. Advanced Filtering with FILTER Clause

What is FILTER?

The FILTER clause is a powerful SQL feature available in PostgreSQL and MSSQL (via conditional aggregation). It allows applying aggregate functions only to a subset of rows, which is useful when you need different calculations within the same query.

Why Use FILTER?

? Provides a cleaner syntax for conditional aggregation.

? Eliminates the need for CASE statements inside aggregate functions.

? Improves readability and performance of queries.

Drawbacks:

? Not supported in Oracle (requires CASE WHEN workarounds).

? Can be less efficient than separate queries for large datasets.


Example: Using FILTER in PostgreSQL

Scenario:

We want to calculate:

  1. The total salary of IT professionals (job_id = 'IT_PROG').
  2. The total salary of Sales Representatives (job_id = 'SA_REP').
  3. The overall total salary of all employees.

-- PostgreSQL Only
SELECT 
    department_id,
    SUM(salary) FILTER (WHERE job_id = 'IT_PROG') AS it_salary,
    SUM(salary) FILTER (WHERE job_id = 'SA_REP') AS sales_salary,
    SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;        

Alternative for Oracle & MSSQL (Using CASE Statement)

-- Works in Oracle and MSSQL
SELECT 
    department_id,
    SUM(CASE WHEN job_id = 'IT_PROG' THEN salary END) AS it_salary,
    SUM(CASE WHEN job_id = 'SA_REP' THEN salary END) AS sales_salary,
    SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;        

What These Queries Do:

? Compute job-specific salaries using FILTER (PostgreSQL) or CASE WHEN (Oracle & MSSQL).

? Ensure all salaries are aggregated efficiently.

? Provide a cleaner way to calculate multiple filtered aggregations.


6. Statistical Functions

What are Statistical Functions?

Statistical functions allow for advanced mathematical analysis in SQL. These functions are useful for data science, analytics, and reporting.

Common Statistical Functions:

  • AVG(): Calculates the mean.
  • STDDEV(): Computes the standard deviation of a column.
  • VARIANCE(): Returns the variance of a column.
  • CORR(): Measures the correlation between two variables.

Why Use Statistical Functions?

? Essential for financial analysis, risk assessment, and trend detection.

? Provides data distribution insights.

? Reduces the need for external tools like Excel or Python for statistics.

Drawbacks:

? Can be computationally expensive on large datasets.

? Requires understanding of statistics to interpret correctly.


Example: Using STDDEV() in Oracle, MSSQL, and PostgreSQL

Scenario:

We need to analyze salary variations across different departments by computing the standard deviation.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    department_id,
    STDDEV(salary) AS salary_stddev
FROM employees
GROUP BY department_id;        

Example: Using CORR() to Find Correlation

Scenario:

We want to determine the relationship between years of experience (years_experience) and salary to understand whether higher experience leads to higher salaries.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    CORR(years_experience, salary) AS experience_salary_correlation
FROM employees;        

What These Queries Do:

? Compute salary standard deviation to measure pay dispersion.

? Use correlation analysis (CORR()) to check salary-experience relationships.

? Help in business decisions, like salary adjustments or hiring policies.


7. String Aggregation

What is String Aggregation?

String aggregation functions combine multiple rows of text into a single row. This is particularly useful for displaying lists of values grouped by a certain column.

Why Use String Aggregation?

? Helps in report generation (e.g., listing employees in a department).

? Reduces query complexity when combining text data.

? Eliminates the need for joining multiple rows manually.

Drawbacks:

? Output can become too large if too many values are aggregated.

? Different databases use different functions (LISTAGG in Oracle, STRING_AGG in PostgreSQL/MSSQL).


Example: Using STRING_AGG() in PostgreSQL & MSSQL

Scenario:

We want to list employee names per department in a single row.

-- Works in PostgreSQL & MSSQL
SELECT 
    department_id,
    STRING_AGG(first_name, ', ') AS employee_names
FROM employees
GROUP BY department_id;        

Example: Using LISTAGG() in Oracle

-- Oracle Only
SELECT 
    department_id,
    LISTAGG(first_name, ', ') WITHIN GROUP (ORDER BY first_name) AS employee_names
FROM employees
GROUP BY department_id;        

Alternative for Older Versions (Using WM_CONCAT())

For older Oracle versions that don’t support LISTAGG, we can use WM_CONCAT():

-- Oracle (Older Versions)
SELECT 
    department_id,
    WM_CONCAT(first_name) AS employee_names
FROM employees
GROUP BY department_id;        

What These Queries Do:

? Aggregate employee names into a single row per department.

? Use different functions depending on the SQL database (Oracle: LISTAGG, PostgreSQL/MSSQL: STRING_AGG).

? Improve data presentation in reports.


8. Percentile and Median Calculations

What is Percentile and Median Calculation?

Percentiles and medians are essential statistical measures used in data distribution analysis.

  • Median: The middle value in a dataset when sorted.
  • Percentile: A value below which a given percentage of data falls (e.g., 90th percentile means 90% of values are below it).

Why Use These Functions?

? Helps in salary distribution analysis, performance reviews, and risk assessments.

? Useful for business intelligence and reporting.

? Identifies outliers and data skewness.

Drawbacks:

? Computationally expensive for large datasets.

? Different databases use different functions.


Example: Using PERCENTILE_CONT to Calculate Median

Scenario:

We want to calculate the median salary of employees in each department.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    department_id,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees
GROUP BY department_id;        

Alternative for MSSQL (Using MEDIAN() in SQL Server 2019+)

-- MSSQL 2019+
SELECT 
    department_id,
    MEDIAN(salary) AS median_salary
FROM employees
GROUP BY department_id;
        

What This Query Does:

? Uses PERCENTILE_CONT(0.5) to compute the median salary.

? Groups results by department, calculating median per department.

? Helps in salary distribution analysis and decision-making.


9. Advanced Analytic Functions

What are Advanced Analytic Functions?

These functions allow for ranking, cumulative calculations, and trend analysis over a dataset.

Common Analytic Functions:

  • CUME_DIST(): Calculates cumulative distribution.
  • PERCENT_RANK(): Computes the relative rank of a row.
  • NTILE(n): Divides rows into n equal groups.

Why Use These Functions?

? Ideal for grading systems, financial rankings, and distribution analysis.

? Provides advanced ranking without complex queries.

? Efficient for large datasets.

Drawbacks:

? Not available in older database versions.

? May require large memory consumption when handling huge datasets.


Example: Using CUME_DIST() to Analyze Salary Distribution

Scenario:

We want to determine the cumulative salary distribution to see how salaries are spread out.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    salary,
    CUME_DIST() OVER (ORDER BY salary) AS cumulative_distribution
FROM employees;        

Example: Using NTILE() to Divide Employees into 4 Salary Quartiles

Scenario:

We need to categorize employees into four salary quartiles for performance evaluation.

-- Works in Oracle, MSSQL, PostgreSQL
SELECT 
    employee_id, 
    first_name, 
    salary,
    NTILE(4) OVER (ORDER BY salary) AS salary_quartile
FROM employees;        

What These Queries Do:

? CUME_DIST() analyzes salary distribution, showing what percentage of employees earn less than or equal to a specific salary.

? NTILE(4) divides employees into four salary quartiles for comparative analysis.

? Useful for HR analytics, business strategy, and data science applications.


10. Pivoting and Unpivoting Data

What is Pivoting and Unpivoting?

  • Pivoting: Converts rows into columns (useful for summarizing data).
  • Unpivoting: Converts columns into rows (useful for normalizing data).

Why Use Pivoting & Unpivoting?

? Transforms raw data into a structured format.

? Useful for reporting, dashboards, and data visualization.

? Eliminates complex CASE statements for data transposition.

Drawbacks:

? Pivoting is database-specific (different syntax for each SQL type).

? Unpivoting can create redundant or large datasets.


Example: Pivoting Data in MSSQL

Scenario:

We need to convert job categories into columns, showing total salaries per job per department.

-- MSSQL Only
SELECT 
    department_id,
    [IT_PROG] AS it_salary,
    [SA_REP] AS sales_salary
FROM (
    SELECT department_id, job_id, salary
    FROM employees
) AS src
PIVOT (
    SUM(salary) FOR job_id IN ([IT_PROG], [SA_REP])
) AS pvt;        

Example: Pivoting Data in Oracle (Using PIVOT)

-- Oracle Only
SELECT *
FROM (
    SELECT department_id, job_id, salary
    FROM employees
)
PIVOT (
    SUM(salary) FOR job_id IN ('IT_PROG' AS IT_Salary, 'SA_REP' AS Sales_Salary)
);        

Example: Unpivoting Data in Oracle

Scenario:

We need to convert multiple columns (IT Salary, Sales Salary) into rows.

-- Oracle Only
SELECT *
FROM (
    SELECT department_id, it_salary, sales_salary
    FROM pivoted_data
)
UNPIVOT (
    salary FOR job_id IN (it_salary AS 'IT_PROG', sales_salary AS 'SA_REP')
);        

Example: Unpivoting Data in MSSQL and PostgreSQL

-- MSSQL & PostgreSQL
SELECT department_id, job_id, salary
FROM pivoted_data
UNPIVOT (
    salary FOR job_id IN (it_salary, sales_salary)
) AS unpvt;        

What These Queries Do:

? Pivoting turns rows into columns, summarizing data per category.

? Unpivoting converts columns into rows, normalizing data for analysis.

? Improves report readability and data transformation efficiency.


11. Hierarchical Aggregation

What is Hierarchical Aggregation?

Hierarchical aggregation allows you to summarize data within a hierarchical structure (such as organization trees, product categories, or geographic divisions). This is useful when analyzing aggregated values across parent-child relationships.

Each database system provides different methods:

  • Oracle: Uses CONNECT BY for hierarchical queries.
  • MSSQL: Uses Common Table Expressions (CTEs) for recursive aggregation.
  • PostgreSQL: Also supports recursive CTEs for hierarchical structures.

Example: Summing Salaries Across Hierarchies

Oracle: Using CONNECT BY for Hierarchical Aggregation

SELECT employee_id, manager_id, first_name, last_name, 
       LEVEL AS hierarchy_level, 
       SUM(salary) OVER (PARTITION BY manager_id) AS total_salary_under_manager
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;        

What this query does:

  • Uses LEVEL to define the depth of the hierarchy.
  • Aggregates the SUM(salary) for each manager and their subordinates.
  • Uses CONNECT BY PRIOR to establish parent-child relationships.

MSSQL & PostgreSQL: Using Recursive CTEs

WITH RECURSIVE EmployeeHierarchy AS (
    SELECT employee_id, manager_id, first_name, last_name, salary,
           salary AS total_salary_under_manager
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.employee_id, e.manager_id, e.first_name, e.last_name, e.salary,
           eh.total_salary_under_manager + e.salary
    FROM employees e
    JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM EmployeeHierarchy;        

What this query does:

  • Uses a recursive CTE to compute salaries under each manager.
  • Aggregates salaries at each hierarchy level.
  • Helps in analyzing hierarchical relationships like organizational structures.

? Pro Tip:

  • Oracle’s CONNECT BY is optimized for tree structures but lacks flexibility.
  • Recursive CTEs (MSSQL & PostgreSQL) provide more flexibility and support deeper aggregations.


12. Handling NULL Values in Aggregates

Why Handle NULLs in Aggregates?

SQL aggregate functions usually ignore NULL values. However, when aggregating data, NULL values can cause issues such as incorrect averages or unexpected results.

Techniques to Handle NULLs:

  • COALESCE(): Replaces NULL values with a default value.
  • NULLIF(): Helps avoid division by zero errors.
  • Conditional Aggregation: Using FILTER (PostgreSQL) or CASE (Oracle & MSSQL).

Example: Handling NULL Values in Aggregation

Using COALESCE() to Replace NULLs

SELECT department_id,
       SUM(COALESCE(salary, 0)) AS total_salary
FROM employees
GROUP BY department_id;        

What this query does:

  • Ensures SUM() treats NULLs as 0, preventing incorrect results.

Using NULLIF() to Prevent Division by Zero Errors

SELECT department_id, 
       SUM(salary) / NULLIF(COUNT(salary), 0) AS average_salary
FROM employees
GROUP BY department_id;        

What this query does:

  • NULLIF(COUNT(salary), 0) prevents division by zero errors when no salaries exist.

Using FILTER to Exclude NULLs (PostgreSQL only)

SELECT department_id,
       SUM(salary) FILTER (WHERE salary IS NOT NULL) AS total_salary
FROM employees
GROUP BY department_id;        

What this query does:

  • Ensures SUM() only includes non-null salaries.

? Pro Tip:

  • Always handle NULL values explicitly in aggregate calculations to avoid unexpected results.


13. Custom Aggregate Functions

What Are Custom Aggregates?

Standard aggregate functions (SUM, AVG, etc.) cover most needs, but in complex scenarios, you may need custom aggregates for specialized calculations.

Database support:

  • PostgreSQL: Allows user-defined aggregate functions.
  • MSSQL: Supports CLR-based user-defined aggregates.

Example: Creating a Custom Aggregate in PostgreSQL

Step 1: Define a Custom Function

CREATE FUNCTION custom_avg(state double precision, val double precision)
RETURNS double precision AS $$
BEGIN
    RETURN (state * 0.8 + val * 0.2); -- Weighted Average Calculation
END;
$$ LANGUAGE plpgsql;        

Step 2: Create the Aggregate Function

CREATE AGGREGATE weighted_avg(double precision) (
    SFUNC = custom_avg,
    STYPE = double precision
);        

Step 3: Use the Custom Aggregate

SELECT department_id, weighted_avg(salary)
FROM employees
GROUP BY department_id;        

What this query does:

  • Computes a weighted average salary per department using a custom aggregate function.

? Pro Tip:

  • Custom aggregates improve performance for complex calculations that standard functions cannot handle efficiently.


14. Using JSON Aggregation

Why Use JSON Aggregation?

Modern databases store structured and semi-structured data, often requiring aggregation of JSON objects.

Database support:

  • PostgreSQL: Provides powerful JSON functions (JSON_AGG, JSONB_AGG).
  • MSSQL: Uses FOR JSON for JSON aggregation.

Example: Aggregating Data into JSON Format

PostgreSQL: Using JSON_AGG()

SELECT department_id, 
       JSON_AGG(JSON_BUILD_OBJECT('employee', first_name, 'salary', salary)) AS employee_json
FROM employees
GROUP BY department_id;        

What this query does:

  • Converts multiple employee records into a JSON array for each department.

MSSQL: Using FOR JSON PATH

SELECT department_id,
       (SELECT first_name, salary 
        FROM employees e
        WHERE e.department_id = d.department_id
        FOR JSON PATH) AS employee_json
FROM departments d;        

What this query does:

  • Aggregates employee details into JSON for each department.

? Pro Tip:

  • JSON aggregation simplifies API development by returning structured data directly from the database.


Aggregate functions are at the core of SQL data analysis, enabling us to summarize, transform, and extract insights from datasets. While basic functions like SUM(), AVG(), and COUNT() are widely used, advanced aggregate functions provide greater flexibility, deeper insights, and improved efficiency when working with large or complex data structures.

Final Thoughts

As databases continue to evolve, knowing how to leverage advanced SQL aggregations will be a valuable skill for anyone working with large datasets, business reports, and analytical applications. Whether you work in finance, e-commerce, healthcare, or technology, these techniques will help you extract meaningful insights from data more effectively.

?? Now it’s your turn! Try implementing these functions in your own SQL queries and see the difference in efficiency and clarity!


Keep learning and growing! Follow me for more in-depth SQL insights and advanced data techniques!

要查看或添加评论,请登录

Eugene Koshy的更多文章

社区洞察