Adventures in Machine Learning

Group By or Window Functions? Efficient Ways to Find First Rows in SQL

Using GROUP BY to Find First Rows of Each Group

Data analysis deals with sorting, filtering, and grouping data to gain insights and make informed decisions. GROUP BY is one of the most widely used group functions in SQL, which allows users to group data by one or more columns.

An aggregate function, on the other hand, is used to compute a single value from a set of values. A few examples of aggregate functions include MAX, MIN, COUNT, AVG, and SUM.

Challenge of Selecting First Row of Each Group

Suppose we wanted to select the first row of each group from a large table. It presents a significant challenge to filter out the minimum row from each group as SQL lacks a direct way to carry out such a task.

However, we can use some techniques like using subqueries or window functions with common table expressions (CTE) to find the desired outcome. Approaches for Finding First Row: Correlated Subquery and Window Functions+CTE

One of the most popular ways to get the first row of each group is with a correlated subquery.

A fair warning; it is an extremely inefficient approach to follow with large datasets, but it gets the job done. Essentially, a correlated subquery executes a separate query for each row returned in the main query, leading to longer processing times.

Yet, it can work wonders with small and medium-sized datasets.

The second approach we can use to find the first row of each group is with window functions and CTE.

Unlike correlated subqueries, this approach is more efficient, and it is favored by those looking to separate the query into distinct, easily readable sections. It requires no self-joining or self-referencing while performing exceedingly well and making queries simpler.

Example of Grouping Songs by Artist and Finding Least Streamed Song for Each Artist

Suppose we are given a table with information about songs’ streaming stats by artist name. We can use SQL to group the songs by artist name and return the least streamed song for each artist.

Here’s how the code would look like. SELECT *

FROM songs a

WHERE streams = (

SELECT MIN(streams)

FROM songs b

WHERE a.artist = b.artist


Using Correlated Subqueries

Correlated subqueries are another powerful tool in SQL. They allow queries to reference data from the surrounding query within the subquery.

As such, the subquery’s processing will depend on the results of the main query.

Sample Code for Finding First Row of Each Group Using Correlated Subquery

Suppose we have a table named “scores,” which contains student scores. Here is how we can use a correlated subquery to find the first row of each group.


FROM scores a

WHERE id = (


FROM scores b



Output and Explanation of Result

The output of the code will be a table of the first rows of each group sorted by ID. It works by comparing the ID column’s value to the minimum value of the ID column in the subquery.

The subquery restricts the minimum value by grouping the data by the group to match the IDs and groups in the surrounding query.

Discussion on Efficiency and Readability of the Approach

The correlated subquery approach is extremely inefficient and can be slow when working with large datasets. It is also tricky to read and understand, making queries challenging to maintain and debug.

However, the correlated subquery approach has one advantage that cannot be matched. It is the only solution when working with MySQL versions before 8.

With MySQL 8 and later versions, the window function approach is the preferred way, as it is more efficient, easier to read, and easier to debug.

In conclusion, both correlated subqueries and window functions and CTE offer a possible way to find the first row of each group in SQL.

It is important to understand when to use these approaches depending on the situation, as the correlated subquery approach is less efficient and harder to read but still gets the job done. At the same time, the window function approach is more efficient, easier to read, and easier to debug.

With this knowledge, developers can choose an appropriate one to suit their needs and improve their queries’ efficiency and readings.

3) Using Window Functions and Common Table Expressions

Windows functions and common table expressions (CTE) rank among some of the most powerful SQL features. A window function is a way to carry out calculations across rows that match a defined frame, while a CTE is used to create a temporary result set that we can reference within a SELECT, INSERT, UPDATE, or DELETE statement.

In combination, window functions and CTEs provide an elegant way of solving complex SQL problems.

Sample Code for Finding First Row of Each Group Using Window Functions and CTE

Let’s return to our scores table. Using window functions and CTEs, we can easily find the first row of each group without relying on correlated subqueries.

WITH cte AS (



FROM scores



FROM cte

WHERE row_num = 1;

In this statement, we start by creating a CTE named “cte,” which provides the result set we require. Inside the CTE, a window function called ROW_NUMBER() is used to assign a unique rank to each row within its group based on the ordering of the ID column.

Finally, we select only the first row of each group by filtering for row_num equals 1.

Difference in Output Compared to Approach with Correlated Subquery

While both solutions match the same criteria, the result sets will differ in the way they present data. The output of a correlated subquery will only return columns mentioned in the SELECT statement, while the window function approach returns additional columns from the CTE.

In the example above, by using the window function, we can keep additional columns from the same table that provides useful insights into each group. Benefits of Using Window Functions and CTE, Including Flexibility in Ranking Order

Using window functions and CTE offers a range of advantages beyond the improved efficiency and readability we gain from avoiding correlated subqueries.

They provide flexibility in how we rank information, depending on which column or columns groups need to be separated and ordered. Adding or changing the computations or aggregation functions over columns is easily possible in the CTE.

Another benefit of using window functions with CTE is the potential for creating complex filters. Ranking systems and specific rank ordering is also achievable with window functions.

Developers can quickly add different columns to their output and perform relative ranking within groups to see how different items measure up against each other.

4) Further Exploration of Window Functions

SQL is a flexible and versatile querying system that accommodates all levels of complexity and scale. Window functions have become a staple of SQL for good reasons.

They provide powerful new features, which can save time and resources when analyzing data. However, as with any complex tool, precision is critical when incorporating these functions into our SQL code.

Recommendation to Explore More Capabilities of Window Functions

Suppose you are new to window functions or an experienced user seeking to refine your knowledge. In that case, it’s worth taking a deep dive into the nuances of these functions by exploring their additional capabilities.

There is a vast array of features beyond the basic ranking functions, such as more advanced aggregate functions and window frame specifications. Luckily, there are excellent online resources available to equip you with the skills necessary, such as hands-on courses and practice sets.

Reference to Hands-on Window Functions Course and Practice Set

Sites such as Codecademy offer online courses where new developers or experienced professionals can learn with hands-on experience. The “Analyze Data with SQL” course covers window functions or SQL courses such as “Structured Queries Language” offer an in-depth exploration of window functions and other SQL topics.

Practicing window functions on databases like HackerRank or Kaggle can also provide an opportunity to experiment with more advanced window function features and learn more than ranking or better data visualization.

In conclusion, whether you’re looking to streamline your current SQL development process or looking to master a powerful new technique, exploring window functions with CTE offers an efficient and flexible solution to various SQL queries.

With their abilities to rank, filter, and group data across multiple columns or tables, these tools provide a foundation of reliable and powerful data analysis. In conclusion, this article covered the importance of using GROUP BY, correlated subqueries, window functions, and CTE for finding the first row of each group in SQL.

We highlighted the challenges of selecting the first row of each group and the two approaches to solve them. Correlated subqueries might be less efficient and harder to understand, but it is an excellent alternative in MySQL 8 and older versions.

On the other hand, window functions and CTE are more efficient, easier to read, and easier to debug. Lastly, we recommended exploring more window function capabilities through online resources like hands-on courses and practice sets.

The takeaway is that mastering these SQL features can lead to efficient and flexible data analysis and, ultimately, better decision-making.

Popular Posts