Giao diện
Module 2: Joins & Relations 🔗
📝 Stats
- Số lượng: 8 câu hỏi
- Độ khó: Trung cấp
- Mục tiêu: Tránh lỗi nhân bản dòng (row explosion) khi Join.
MCQ
Q1. Loại Join nào giữ lại TẤT CẢ các dòng của bảng bên trái, bất kể bảng phải có match hay không?
- [ ]
inner_join - [ ]
left_join - [ ]
right_join - [ ]
full_join
Đáp án:
left_join.
Q2. Nếu bạn muốn tìm những khách hàng trong bảng Customers mà KHÔNG có đơn hàng nào trong bảng Orders. Bạn dùng lệnh gì?
- [ ]
left_join(Customers, Orders)và lọc NA. - [ ]
anti_join(Customers, Orders) - [ ]
semi_join(Customers, Orders) - [ ]
inner_join(Customers, Orders)
Đáp án:
anti_join(Customers, Orders). (Cách 1 cũng đúng nhưnganti_jointường minh và hiệu quả hơn).
Q3. Giả sử bảng A có 10 dòng, bảng B có 10 dòng. Nếu key join là unique ở cả 2 bảng, inner_join sẽ trả về tối đa bao nhiêu dòng?
- [ ] 10
- [ ] 20
- [ ] 100
- [ ] 0
Đáp án: 10 (Trường hợp match 1-1 hoàn toàn).
Q4. Giả sử bảng A có 1 dòng (key=1), bảng B có 2 dòng (key=1). left_join(A, B) sẽ trả về bao nhiêu dòng?
- [ ] 1
- [ ] 2
- [ ] Lỗi
- [ ] Warning
Đáp án: 2. (Đây là hiện tượng 1-to-many, dòng ở bảng A bị nhân bản lên).
Coding Challenge
Challenge: Fraud Detection (Đơn giản)
Bạn có 2 bảng:
transactions:user_id,amount,txn_id.blacklisted_users:user_id,reason.
Nhiệm vụ:
- Tìm tất cả các giao dịch được thực hiện bởi user nằm trong blacklist.
- Tìm tất cả các giao dịch "sạch" (User KHÔNG nằm trong blacklist).
r
# Data
txns <- tibble(txn_id = 1:5, user_id = c(1, 2, 1, 3, 4), amount = 100)
bl <- tibble(user_id = c(1, 3), reason = "Scammer")
# 1. Giao dịch đen (Dùng semi_join hoặc inner_join)
bad_txns <- txns |> semi_join(bl, by = "user_id")
# -> txn 1, 3 (của user 1) và txn 4 (của user 3)
# 2. Giao dịch sạch (Dùng anti_join)
clean_txns <- txns |> anti_join(bl, by = "user_id")
# -> user 2, 4