你作为数据开发岗位的面试官请参考谷歌和微软的面试题我作为中级数据开发工程师请为我出一道原创的笔试题并给出详细答案要求问题为原创难度中等请使用中文回答。
题目描述:
假设你是一家电商公司的数据开发工程师,负责数据仓库的建设和维护。现在,有一份包含所有订单信息的数据源文件,文件格式为CSV,其中包括订单ID、客户ID、订单金额、订单时间等信息。请你设计一个数据仓库模型,将该数据源文件导入数据仓库,并回答以下问题:
- 请列出所有订单金额在2000元以上的订单ID和客户ID。
- 请统计每个客户的订单总金额,并按照订单总金额从高到低排序,列出前10个客户。
- 请统计每个月的订单总金额,并按照月份从早到晚排序,列出每个月的订单总金额。
要求:
- 使用SQL语言完成该题目。
- 请考虑性能优化,尽可能避免全表扫描。
- 请将建表语句和导入数据的脚本附在答案中。
建表语句:
CREATE TABLE orders ( order_id INT NOT NULL, customer_id INT NOT NULL, order_amount DECIMAL(10,2) NOT NULL, order_time DATETIME NOT NULL, PRIMARY KEY (order_id) );
导入数据脚本:
LOAD DATA LOCAL INFILE '/path/to/data/orders.csv' INTO TABLE orders FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
答案:
- 列出所有订单金额在2000元以上的订单ID和客户ID。
SELECT order_id, customer_id
FROM orders
WHERE order_amount >= 2000;
- 统计每个客户的订单总金额,并按照订单总金额从高到低排序,列出前10个客户。
SELECT customer_id, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id
ORDER BY total_amount DESC
LIMIT 10;
- 统计每个月的订单总金额,并按照月份从早到晚排序,列出每个月的订单总金额。
SELECT DATE_FORMAT(order_time, '%Y-%m') AS month, SUM(order_amount) AS total_amount
FROM orders
GROUP BY month
ORDER BY month ASC;
性能优化:
- 在建表时,将订单ID设置为主键,可以加快查询速度。
- 在导入数据时,使用LOAD DATA INFILE命令可以快速导入大量数据。
- 可以对order_amount字段添加索引,加快查询速度。
- 在查询语句中使用GROUP BY时,可以避免使用DISTINCT来去重,因为GROUP BY已经能够去重并统计。
- 可以使用EXPLAIN语句来分析查询语句的执行计划,找出慢查询的瓶颈并进行优化。
原文地址: https://www.cveoy.top/t/topic/1rG 著作权归作者所有。请勿转载和采集!