Claude cho Data: Viết SQL queries phức tạp
Điểm nổi bật
Nhấn để đến mục tương ứng
- 1 Muốn làm chủ cách đặt yêu cầu sql hiệu quả, hãy bắt đầu từ việc hiểu Chất lượng SQL tốt bắt đầu từ mô tả rõ ràng. Bao gồm: SQL Dialect : BigQuery, PostgreSQL, Snowflake, Redshift, hay MySQL? Tên bảng và cột : Nếu biết — kỹ thuật này được nhiều developer áp dụng thành công trong dự án thực tế.
- 2 Điểm cần cân nhắc khi sử dụng ví dụ 2: cohort retention analysis: Viết SQL BigQuery cohort retention: - Nhóm users theo tháng đăng ký đầu tiên - Tính % users còn hoạt động tại tháng 1, 3, 6 — không phải mọi trường hợp đều phù hợp, cần đánh giá bối cảnh cụ thể trước khi áp dụng.
- 3 Dữ liệu từ tối ưu hiệu suất cho bảng lớn cho thấy: Bảng events của chúng tôi có 500 triệu hàng, partitioned theo event_date BigQuery. Viết query tìm top 100 users theo số events trong 7 ngày gần nhất. Cần tối ưu để không scan toàn bảng — những con số này phản ánh mức độ cải thiện thực tế mà người dùng có thể kỳ vọng.
- 4 Bước thực hành then chốt trong chuyển đổi giữa sql dialects: Convert query Snowflake này sang BigQuery syntax: SELECT DATE_TRUNC'month', created_at AS month, LISTAGGproduct_name, ', ' WITHIN GROUP ORDER BY revenue DESC AS products FROM sales GROUP BY 1 — nắm vững điều này giúp bạn triển khai nhanh hơn và giảm thiểu lỗi thường gặp.
- 5 Về tối ưu hóa sql cho warehouse lớn, thực tế cho thấy Với data warehouse lớn, cách viết query ảnh hưởng trực tiếp đến chi phí và tốc độ. Hãy cho Claude biết scale để nhận gợi ý tối ưu phù hợp: Bảng events: 800 triệu hàng, partitioned theo event_date BigQuery — đây là con dao hai lưỡi nếu không hiểu rõ giới hạn và điều kiện áp dụng của nó.
Viết SQL là kỹ năng cốt lõi của data analyst, nhưng với queries phức tạp — nhiều CTE, window functions, joins chéo bảng — thậm chí analyst kỳ cựu cũng mất nhiều thời gian. Claude có thể viết SQL chính xác theo dialect cụ thể của bạn, giải thích từng bước, và tối ưu hiệu suất cho dataset lớn.
Cách đặt yêu cầu SQL hiệu quả
Chất lượng SQL tốt bắt đầu từ mô tả rõ ràng. Bao gồm:
- SQL Dialect: BigQuery, PostgreSQL, Snowflake, Redshift, hay MySQL?
- Tên bảng và cột: Nếu biết, nêu cụ thể — tiết kiệm vòng lặp hỏi-đáp
- Output mong muốn: Kết quả có dạng gì? Mấy cột, groupby gì?
- Filter điều kiện: Khoảng thời gian, trạng thái, exclusions
- Scale dữ liệu: 1 triệu hay 1 tỷ hàng — ảnh hưởng đến cách tối ưu
Ví dụ 1: Phân tích funnel chuyển đổi
Viết SQL (PostgreSQL) phân tích funnel đăng ký cho app fintech:
Bảng events(user_id, event_name, created_at)
Events: 'app_open', 'signup_start', 'otp_verified',
'kyc_submitted', 'kyc_approved', 'first_transaction'
Yêu cầu:
- Đếm unique users ở mỗi bước funnel
- Tính tỷ lệ chuyển đổi giữa từng bước (step-over-step)
- Lọc: 30 ngày gần nhất
- Kết quả: step_name, user_count, conversion_rate
Claude sẽ tạo query dạng CTE có cấu trúc rõ ràng:
WITH funnel AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'app_open' THEN 1 ELSE 0 END) AS step_1_open,
MAX(CASE WHEN event_name = 'signup_start' THEN 1 ELSE 0 END) AS step_2_start,
MAX(CASE WHEN event_name = 'otp_verified' THEN 1 ELSE 0 END) AS step_3_otp,
MAX(CASE WHEN event_name = 'kyc_submitted' THEN 1 ELSE 0 END) AS step_4_kyc_sub,
MAX(CASE WHEN event_name = 'kyc_approved' THEN 1 ELSE 0 END) AS step_5_kyc_ok,
MAX(CASE WHEN event_name = 'first_transaction' THEN 1 ELSE 0 END) AS step_6_txn
FROM events
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
),
counts AS (
SELECT
SUM(step_1_open) AS cnt_open,
SUM(step_2_start) AS cnt_start,
SUM(step_3_otp) AS cnt_otp,
SUM(step_4_kyc_sub) AS cnt_kyc_sub,
SUM(step_5_kyc_ok) AS cnt_kyc_ok,
SUM(step_6_txn) AS cnt_txn
FROM funnel
)
SELECT
step_name,
user_count,
ROUND(100.0 * user_count / NULLIF(LAG(user_count) OVER (ORDER BY step_order), 0), 1)
AS conversion_rate_pct
FROM (
VALUES
(1, 'App Open', (SELECT cnt_open FROM counts)),
(2, 'Signup Start', (SELECT cnt_start FROM counts)),
(3, 'OTP Verified', (SELECT cnt_otp FROM counts)),
(4, 'KYC Submitted', (SELECT cnt_kyc_sub FROM counts)),
(5, 'KYC Approved', (SELECT cnt_kyc_ok FROM counts)),
(6, 'First Transaction', (SELECT cnt_txn FROM counts))
) t(step_order, step_name, user_count)
ORDER BY step_order;
Ví dụ 2: Cohort retention analysis
Viết SQL (BigQuery) cohort retention:
- Nhóm users theo tháng đăng ký đầu tiên
- Tính % users còn hoạt động tại tháng 1, 3, 6, 12 sau đăng ký
- "Hoạt động" = có ít nhất 1 giao dịch trong tháng đó
- Bảng: users(user_id, signup_date), transactions(user_id, txn_date)
Ví dụ 3: Window functions cho ranking
Snowflake SQL: Tìm top 3 sản phẩm bán chạy nhất
theo doanh thu trong mỗi danh mục, tháng 3/2026.
Nếu có nhiều sản phẩm cùng doanh thu, lấy cả tất cả.
Bảng: order_items(order_id, product_id, quantity, unit_price)
products(product_id, product_name, category)
orders(order_id, order_date, status)
Chỉ lấy orders có status = 'completed'.
Claude sẽ dùng DENSE_RANK() window function — đúng cho yêu cầu "lấy cả khi bằng nhau":
WITH product_revenue AS (
SELECT
p.category,
p.product_name,
SUM(oi.quantity * oi.unit_price) AS revenue
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE DATE_TRUNC('MONTH', o.order_date) = '2026-03-01'
AND o.status = 'completed'
GROUP BY p.category, p.product_name
),
ranked AS (
SELECT
category,
product_name,
revenue,
DENSE_RANK() OVER (PARTITION BY category ORDER BY revenue DESC) AS rnk
FROM product_revenue
)
SELECT category, product_name, revenue, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY category, rnk;
Tối ưu hiệu suất cho bảng lớn
Bảng events của chúng tôi có 500 triệu hàng,
partitioned theo event_date (BigQuery).
Viết query tìm top 100 users theo số events
trong 7 ngày gần nhất. Cần tối ưu để không scan toàn bảng.
Claude sẽ tự động áp dụng best practice theo dialect:
-
BigQuery: Filter trên partition column, dùng
APPROX_COUNT_DISTINCTthayCOUNT(DISTINCT)khi ước tính được -
Snowflake: Gợi ý clustering key, dùng
RESULT_SCAN(LAST_QUERY_ID())tránh chạy lại -
PostgreSQL: Gợi ý index phù hợp, dùng
EXISTSthayINcho subquery lớn
Debug SQL sai
Khi query trả về kết quả bất ngờ:
Query này của tôi trả về 3x số hàng mong đợi.
Tôi nghi join bị explode. Hãy tìm vấn đề:
SELECT
u.user_id,
COUNT(o.order_id) AS order_count
FROM users u
LEFT JOIN orders o ON u.user_id = o.customer_id
LEFT JOIN payments p ON o.order_id = p.order_id
WHERE u.segment = 'retail'
GROUP BY u.user_id;
Bảng orders: 1 order có thể có nhiều payments (trả góp).
Claude sẽ identify ngay: join với payments tạo nhiều hàng trên mỗi order, làm COUNT(o.order_id) bị inflate. Giải pháp: đếm distinct hoặc aggregate payments trước khi join.
Chuyển đổi giữa SQL dialects
Convert query Snowflake này sang BigQuery syntax:
SELECT
DATE_TRUNC('month', created_at) AS month,
LISTAGG(product_name, ', ') WITHIN GROUP (ORDER BY revenue DESC) AS products
FROM sales
GROUP BY 1;
Patterns SQL nâng cao thường dùng
Deduplication: Giữ bản ghi mới nhất
-- Bảng customers có duplicate do sync lỗi.
-- Giữ bản ghi updated_at mới nhất cho mỗi customer_id
WITH ranked AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY updated_at DESC
) AS rn
FROM customers
)
SELECT * FROM ranked WHERE rn = 1;
Running total và moving average
-- GMV tích lũy từ đầu năm và moving average 7 ngày
SELECT
order_date,
daily_gmv,
SUM(daily_gmv) OVER (
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS ytd_gmv,
AVG(daily_gmv) OVER (
ORDER BY order_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7d
FROM daily_sales
ORDER BY order_date;
Percent of total trong nhóm
-- Tỷ lệ doanh thu mỗi tỉnh trên tổng toàn quốc
-- và tỷ lệ trong nhóm vùng (Bắc/Trung/Nam)
SELECT
province,
region,
revenue,
ROUND(100.0 * revenue / SUM(revenue) OVER (), 2) AS pct_national,
ROUND(100.0 * revenue / SUM(revenue) OVER (PARTITION BY region), 2) AS pct_region
FROM province_revenue
ORDER BY revenue DESC;
Tối ưu hóa SQL cho warehouse lớn
Với data warehouse lớn, cách viết query ảnh hưởng trực tiếp đến chi phí và tốc độ. Hãy cho Claude biết scale để nhận gợi ý tối ưu phù hợp:
Bảng events: 800 triệu hàng, partitioned theo event_date (BigQuery).
Tôi cần đếm unique users theo event_type trong 7 ngày gần nhất.
Tối ưu để giảm bytes scanned.
Claude sẽ áp dụng các kỹ thuật:
-
BigQuery: Luôn filter trên partition column
event_date, dùngAPPROX_COUNT_DISTINCT()thayCOUNT(DISTINCT)khi ước tính được (nhanh hơn 10x, sai số dưới 2%) -
Snowflake: Filter trên clustering key, tránh full table scan, dùng
RESULT_SCAN(LAST_QUERY_ID())để không chạy lại query đắt tiền -
PostgreSQL: Gợi ý tạo partial index, dùng
EXISTSthayINcho subquery lớn - Redshift: Kiểm tra distribution key để tránh cross-node shuffle
Nhờ Claude giải thích query của người khác
Nhận query phức tạp từ đồng nghiệp mà không hiểu? Paste vào và hỏi:
Giải thích query này từng bước. Tôi không hiểu tại sao
dùng LATERAL FLATTEN ở đây và logic trong CASE WHEN là gì:
[paste query phức tạp]
Sau đó cho biết: có cách viết đơn giản hơn không?
Bước tiếp theo
Sau khi thành thạo SQL với Claude, tìm hiểu cách viết database queries từ ngôn ngữ tự nhiên — không cần biết tên bảng hay cú pháp, chỉ cần mô tả dữ liệu bạn cần.
Bài viết liên quan
Bai viet co huu ich khong?
Bản quyền thuộc về tác giả. Vui lòng dẫn nguồn khi chia sẻ.



