数据开发工程师笔试题:电商数据仓库模型设计
题目描述:
假设你是一家电商公司的数据开发工程师,负责数据仓库的建设和维护。现在,有一份包含所有订单信息的数据源文件,文件格式为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/mmiN 著作权归作者所有。请勿转载和采集!