Frequently Bought Together

Find pairs of different products that appear together in the same order (any status) in at least 3 distinct orders. Report each pair once, with the lower product_id as product_a.

Expected output

product_a, product_b (product names), orders. Sorted by orders descending, then product_a, then product_b.

Row order is checked. Column names are not checked; numbers are compared to 2 decimals.

Dataset: E-commerce store

An online store selling electronics, home goods, books, apparel and beauty products to customers in six countries (Jan 2025 to Mar 2026).

customers

One row per registered customer.

customer_idINTEGERprimary key
nameTEXT
countryTEXTUS, UK, DE, IN, BR or CA
signup_dateTEXTYYYY-MM-DD
referred_byINTEGERcustomer_id of the referrer, NULL if none
products

Product catalog with current list price.

product_idINTEGERprimary key
nameTEXT
categoryTEXT
priceREALlist price in USD
orders

One row per order. Only completed orders count as revenue.

order_idINTEGERprimary key, increases with order_date
customer_idINTEGER
order_dateTEXTYYYY-MM-DD
statusTEXTcompleted, cancelled or returned
order_items

Line items. Revenue of a line = quantity * unit_price (unit_price may include a discount).

order_idINTEGER
product_idINTEGER
quantityINTEGER
unit_priceREALprice actually charged per unit

Engine: SQLite. Dates are text (YYYY-MM-DD); use strftime(), date() and julianday() for date math.

Related problems

SQLite · runs in your browser
Ctrl/⌘ + Enter to run
Expected output preview (28 rows, order matters)
product_aproduct_borders
USB-C ChargerLip Balm Trio9
Ceramic Mug SetCotton T-Shirt5
Cotton T-ShirtLip Balm Trio4

Showing 3 of 28 rows.

Hints

Worked solution

Run at least one query to unlock it.