Skip to content

How have American baby name tastes changed since 1920? Which names have remained popular for over 100 years, and how do those names compare to more recent top baby names? These are considerations for many new parents, but the skills you'll practice while answering these queries are broadly applicable. After all, understanding trends and popularity is important for many businesses, too!

You'll be working with data provided by the United States Social Security Administration, which lists first names along with the number and sex of babies they were given to in each year. For processing speed purposes, the dataset is limited to first names which were given to over 5,000 American babies in a given year. The data spans 101 years, from 1920 through 2020.

The Data

baby_names

columntypedescription
yearintyear
first_namevarcharfirst name
sexvarcharsex of babies given first_name
numintnumber of babies of sex given first_name in that year
Spinner
DataFrameas
usa_baby_names
variable
-- Run this code to view the data in baby_names
SELECT *
FROM baby_names
LIMIT 5;
Spinner
DataFrameas
name_types
variable
-- Use this table for the answer to question 1:
-- List the overall top five names in alphabetical order and find out if each name is "Classic" or "Trendy."
SELECT
    first_name,
    COUNT(DISTINCT year) AS sum,
    CASE 
        WHEN COUNT(DISTINCT year) >= 50 THEN 'Classic'
        ELSE 'Trendy'
    END AS popularity_type
FROM baby_names
GROUP BY first_name
ORDER BY first_name
LIMIT 5;
Spinner
DataFrameas
top_20
variable
-- Use a CTE to calculate totals and rank
WITH male_name_totals AS (
    SELECT
        first_name,
        SUM(num) AS sum
    FROM baby_names
    WHERE sex = 'M'
    GROUP BY first_name
),
ranked_names AS (
    SELECT
        first_name,
        sum,
        RANK() OVER (ORDER BY sum DESC) AS name_rank
    FROM male_name_totals
)
-- Save as: top_20
SELECT name_rank, first_name, sum
FROM ranked_names
WHERE name_rank <= 20
   OR first_name = 'Paul'
ORDER BY name_rank;
Spinner
DataFrameas
a_names
variable
-- Use this table for the answer to question 3:
-- Which female names appeared in both 1920 and 2020?

SELECT
    b1920.first_name,
    (b1920.total + b2020.total) AS total_occurrences
FROM (
    SELECT first_name, SUM(num) AS total
    FROM baby_names
    WHERE sex = 'F' AND year = 1920
    GROUP BY first_name
) b1920
INNER JOIN (
    SELECT first_name, SUM(num) AS total
    FROM baby_names
    WHERE sex = 'F' AND year = 2020
    GROUP BY first_name
) b2020
ON b1920.first_name = b2020.first_name
ORDER BY total_occurrences DESC;