Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit bcee40a

Browse files
Update readme.md
1 parent 724e843 commit bcee40a

File tree

1 file changed

+181
-0
lines changed
  • LeetCode SQL 50 Solution/1045. Customers Who Bought All Products

1 file changed

+181
-0
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
Here’s the updated README.md, including **Pandas and Window SQL solutions** along with the original **MySQL solution**.
2+
3+
---
4+
5+
# **1045. Customers Who Bought All Products**
6+
7+
## **Problem Statement**
8+
You are given two tables:
9+
- `Customer` (contains `customer_id` and `product_key`)
10+
- `Product` (contains all available `product_key`s)
11+
12+
Each `product_key` in `Customer` is a **foreign key** referring to the `Product` table.
13+
14+
### **Customer Table**
15+
```
16+
+-------------+-------------+
17+
| Column Name | Type |
18+
+-------------+-------------+
19+
| customer_id | int |
20+
| product_key | int |
21+
+-------------+-------------+
22+
```
23+
- The table may contain **duplicate rows**.
24+
- `customer_id` is **not NULL**.
25+
- `product_key` refers to the `Product` table.
26+
27+
### **Product Table**
28+
```
29+
+-------------+
30+
| product_key |
31+
+-------------+
32+
| int |
33+
+-------------+
34+
```
35+
- `product_key` is the **primary key** (unique values) of this table.
36+
37+
### **Task:**
38+
Find **all customer IDs** who bought **every product** listed in the `Product` table.
39+
40+
---
41+
42+
## **Example 1:**
43+
44+
### **Input:**
45+
**Customer Table**
46+
```
47+
+-------------+-------------+
48+
| customer_id | product_key |
49+
+-------------+-------------+
50+
| 1 | 5 |
51+
| 2 | 6 |
52+
| 3 | 5 |
53+
| 3 | 6 |
54+
| 1 | 6 |
55+
+-------------+-------------+
56+
```
57+
58+
**Product Table**
59+
```
60+
+-------------+
61+
| product_key |
62+
+-------------+
63+
| 5 |
64+
| 6 |
65+
+-------------+
66+
```
67+
68+
### **Output:**
69+
```
70+
+-------------+
71+
| customer_id |
72+
+-------------+
73+
| 1 |
74+
| 3 |
75+
+-------------+
76+
```
77+
78+
### **Explanation:**
79+
- There are **two products** (5 and 6).
80+
- Customers who bought **both** products:
81+
- **Customer 1**: Bought `5, 6`
82+
- **Customer 2**: Bought `6` ❌ (missing `5`)
83+
- **Customer 3**: Bought `5, 6`
84+
- So, **customers 1 and 3** are returned.
85+
86+
---
87+
88+
## **SQL Solutions**
89+
90+
### **1️⃣ Standard MySQL Solution**
91+
```sql
92+
SELECT customer_id
93+
FROM Customer
94+
GROUP BY customer_id
95+
HAVING COUNT(DISTINCT product_key) = (SELECT COUNT(product_key) FROM Product);
96+
```
97+
#### **Explanation:**
98+
1. **GROUP BY `customer_id`** → Group purchases per customer.
99+
2. **COUNT(DISTINCT product_key)** → Count unique products each customer bought.
100+
3. **Compare with total products:**
101+
- `(SELECT COUNT(product_key) FROM Product)` counts all available products.
102+
- Only customers with `COUNT(DISTINCT product_key) = total products` are included.
103+
4. **HAVING** ensures we return only those who bought **all products**.
104+
105+
---
106+
107+
### **2️⃣ Window Function (SQL) Solution**
108+
```sql
109+
WITH product_count AS (
110+
SELECT COUNT(*) AS total_products FROM Product
111+
),
112+
customer_purchase AS (
113+
SELECT customer_id, COUNT(DISTINCT product_key) AS purchased_count
114+
FROM Customer
115+
GROUP BY customer_id
116+
)
117+
SELECT customer_id
118+
FROM customer_purchase, product_count
119+
WHERE customer_purchase.purchased_count = product_count.total_products;
120+
```
121+
#### **Explanation:**
122+
1. **CTE `product_count`** → Stores total number of products in `Product` table.
123+
2. **CTE `customer_purchase`** → Groups purchases per customer and counts distinct products.
124+
3. **Final SELECT query** → Compares each customer's purchase count with `total_products` and returns only those who match.
125+
126+
---
127+
128+
## **Pandas Solution (Python)**
129+
```python
130+
import pandas as pd
131+
132+
# Sample data
133+
customer_data = {'customer_id': [1, 2, 3, 3, 1],
134+
'product_key': [5, 6, 5, 6, 6]}
135+
product_data = {'product_key': [5, 6]}
136+
137+
# Create DataFrames
138+
customer_df = pd.DataFrame(customer_data)
139+
product_df = pd.DataFrame(product_data)
140+
141+
# Get the total number of products
142+
total_products = product_df['product_key'].nunique()
143+
144+
# Count distinct products per customer
145+
customer_purchase = customer_df.groupby('customer_id')['product_key'].nunique()
146+
147+
# Filter customers who bought all products
148+
result = customer_purchase[customer_purchase == total_products].reset_index()
149+
150+
print(result)
151+
```
152+
153+
### **Explanation:**
154+
1. **Create DataFrames** → Convert customer and product tables into Pandas DataFrames.
155+
2. **Get total unique products**`product_df['product_key'].nunique()`
156+
3. **Count distinct products per customer**`.groupby('customer_id')['product_key'].nunique()`
157+
4. **Filter customers who match total products** → Customers with `purchased_count == total_products`
158+
5. **Return final result**.
159+
160+
---
161+
162+
## **File Structure**
163+
```
164+
LeetCode1045/
165+
├── problem_statement.md # Contains the problem description and constraints.
166+
├── sql_solution.sql # Contains the SQL solutions (Standard + Window Functions).
167+
├── pandas_solution.py # Contains the Pandas solution.
168+
├── README.md # Overview of the problem and available solutions.
169+
```
170+
171+
---
172+
173+
## **Useful Links**
174+
- [LeetCode Problem 1045](https://leetcode.com/problems/customers-who-bought-all-products/)
175+
- [SQL GROUP BY Documentation](https://www.w3schools.com/sql/sql_groupby.asp)
176+
- [SQL HAVING Clause](https://www.w3schools.com/sql/sql_having.asp)
177+
- [Pandas GroupBy Documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)
178+
179+
---ture & Useful Links**
180+
181+
🚀 **Now it's a complete guide!** 🚀

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /