Search
Search Icon Icon to open search 使用 GPT 进行数据分析 上次更新于
Feb 24, 2023
编辑源文件
GPT 需要从我们这边获取的内容:
可以使用的数据表结构 和样本数据(数据非必需) 我们需要解答的分析问题 明确的指示:非必需,但是详细明确的提示,有助于生成高质量的答案 请求方式见:openAI api - Text Completions
下面这个是模版:
1
2
3
4
5
6
7
{数据表的内容(表结构和样本数据)}
作为一个资深的分析师,根据以上提供的表结构和数据,编写一条详细且准确的 MySQL 查询语句来解答如下分析问题:
"{问题}"
并根据你的逻辑对查询进行注解。
这里我来看一个完整的 prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
订单表 orders 的表结构如下:
uuid Text comment '订单ID'
user_id text comment '用户ID'
store_id text comment '门店ID'
amt double comment '订单金额'
created_at timestamp comment '创建时间'
time_ship_end timestamp comment '配送完成时间'
订单商品表 order_products 的表结构如下:
uuid Text comment '主键'
order_id Text commnet '订单ID'
product_id Text comment '商品ID'
units int comment '份数'
real_price double comment '实际单价'
created_at timestamp comment '创建时间'
商品表 products 的表结构如下:
uuid Text comment '商品ID'
name Text comment '商品名'
price double comment '建议零售价'
created_at timestamp comment '创建时间'
作为一个资深的分析师,根据上面给出的表结构,写出一个详细和正确的 MySQL 查询来回答下面分析问题:
"给出商品销量占比"
根据你的逻辑注释查询。
下面是 GPT 给出来的答案:
1
2
3
4
5
6
7
8
SELECT products . name , SUM ( order_products . units ) as total_units ,
SUM ( order_products . units * order_products . real_price ) as total_sales ,
SUM ( order_products . units * order_products . real_price ) /
( SELECT SUM ( units * real_price ) FROM order_products ) as sales_percentage
FROM order_products
JOIN products ON order_products . product_id = products . uuid
GROUP BY products . name
ORDER BY total_sales DESC
该查询首先使用 JOIN
连接 order_products
表和 products
表,通过 product_id
和 uuid
字段建立关联,得到每个订单商品对应的商品名称。然后使用 GROUP BY
对商品名称进行分组,统计每个商品的销售数量和销售总额。接着使用一个子查询计算总销售额,并将每个商品的销售总额除以总销售额得到销售占比,别名为 sales_percentage
。最后使用 ORDER BY
将结果按照销售总额降序排列,得到商品销售量占比。
# 1. 过滤 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙
Customer 的表结构如下:
id INTEGER COMMENT "主键"
name VARCHAR(50)
phone VARCHAR(15)
address VARCHAR(100)
Customer 的样本数据如下:
id name phone address
1 张三 13888888888 上海市浦东新区
2 李四 13999999999 北京市海淀区
3 王五 13666666666 广州市天河区
根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:
"获取客户 A 的电话号码和住址"
并使用你的逻辑来注释它。
下面是 GPT 给出来的答案:
1
2
3
SELECT phone , address
FROM Customer
WHERE name = 'A'
该查询语句会从 Customer 表中筛选出 name 等于 ‘A’ 的记录,然后只返回这些记录中的 phone 和 address 字段,即客户 A 的电话号码和住址。
# 2. 聚合 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙
Order 的表结构如下:
id INTEGER
order_no VARCHAR(50)
customer_id INTEGER
payment_id INTEGER
shipping_address_id INTEGER
order_status_id INTEGER
invoice_id INTEGER
created_at DATETIME
updated_at DATETIME
Order 的样本数据如下:
id order_no customer_id payment_id shipping_address_id order_status_id invoice_id created_at updated_at
1 20220601001 1 1 1 2 2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
2 20220601002 2 3 2 1 NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
3 20220602001 3 2 3 3 1.0 2022-06-02 08:00:00 NaT
根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:
"统计每个月的订单数"
并使用你的逻辑来注释它。
下面是 GPT 给出来的答案:
1
2
3
4
5
6
7
8
9
SELECT
DATE_FORMAT ( created_at , '%Y-%m' ) AS month ,
COUNT ( * ) AS order_count
FROM
Order
GROUP BY
month ;
-- 将创建时间按年-月格式化,统计每个月的订单数,并按月份分组。
# 3. 连表 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙
Customer 的表结构如下:
id INTEGER COMMENT "主键"
name VARCHAR(50)
phone VARCHAR(15)
address VARCHAR(100)
Customer 的样本数据如下:
id name phone address
1 张三 13888888888 上海市浦东新区
2 李四 13999999999 北京市海淀区
3 王五 13666666666 广州市天河区
Order 的表结构如下:
id INTEGER
order_no VARCHAR(50)
customer_id INTEGER
payment_id INTEGER
shipping_address_id INTEGER
order_status_id INTEGER
invoice_id INTEGER
created_at DATETIME
updated_at DATETIME
Order 的样本数据如下:
id order_no customer_id payment_id shipping_address_id order_status_id invoice_id created_at updated_at
1 20220601001 1 1 1 2 2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
2 20220601002 2 3 2 1 NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
3 20220602001 3 2 3 3 1.0 2022-06-02 08:00:00 NaT
根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:
"获取本月的所有订单,需要显示客户名和单号"
并使用你的逻辑来注释它。
下面是 GPT 给出来的答案:
1
2
3
4
5
6
7
8
9
10
SELECT c . name , o . order_no
FROM Customer c
INNER JOIN Order o
ON c . id = o . customer_id
WHERE MONTH ( o . created_at ) = MONTH ( CURRENT_DATE ())
AND YEAR ( o . created_at ) = YEAR ( CURRENT_DATE ());
-- 使用内连接将 Customer 表和 Order 表连接起来
-- 在 WHERE 子句中筛选出本月的订单
-- 最后只选出客户名和单号这两个需要显示的字段
# 4. 连表聚合 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
现在你是一个资深的分析师,有着丰富分析经验和SQL能力,请你帮个忙
Customer 的表结构如下:
id INTEGER COMMENT "主键"
name VARCHAR(50)
phone VARCHAR(15)
address VARCHAR(100)
Customer 的样本数据如下:
id name phone address
1 张三 13888888888 上海市浦东新区
2 李四 13999999999 北京市海淀区
3 王五 13666666666 广州市天河区
Order 的表结构如下:
id INTEGER
order_no VARCHAR(50)
customer_id INTEGER
payment_id INTEGER
shipping_address_id INTEGER
order_status_id INTEGER
invoice_id INTEGER
created_at DATETIME
updated_at DATETIME
Order 的样本数据如下:
id order_no customer_id payment_id shipping_address_id order_status_id invoice_id created_at updated_at
1 20220601001 1 1 1 2 2.0 2022-06-01 09:00:00 2022-06-02 10:00:00
2 20220601002 2 3 2 1 NaN 2022-06-01 14:00:00 2022-06-02 16:00:00
3 20220602001 3 2 3 3 1.0 2022-06-02 08:00:00 NaT
根据以上提供的数据结构和数据,编写一个具体和准确的 mysql 的查询语句来回答如下分析问题:
"统计每个月的手机号数量"
并使用你的逻辑来注释它。
下面是 GPT 给出来的答案:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
DATE_FORMAT ( created_at , '%Y-%m' ) AS ` month ` , -- 提取订单创建时间的月份
COUNT ( DISTINCT phone ) AS phone_count -- 统计每月不同手机号的数量
FROM
Order o
JOIN Customer c ON o . customer_id = c . id -- 关联订单和顾客表
WHERE
c . phone IS NOT NULL -- 排除手机号为空的顾客
GROUP BY
` month ` -- 按月份分组
ORDER BY
` month ` ASC ; -- 按月份升序排列
逻辑解析:
通过JOIN操作关联订单表和顾客表,以获取订单所属顾客的手机号码信息。 使用DATE_FORMAT()函数提取订单创建时间的月份信息。 使用COUNT()函数和DISTINCT关键字统计每个月份下不同手机号的数量。 使用WHERE子句过滤出手机号不为空的顾客。 使用GROUP BY子句按月份对数据进行分组。 使用ORDER BY子句按月份升序排列结果。