mfy学习笔记

创建表并导入数据

sql 复制代码
CREATE TABLE sales (
    id INT,
    salesperson STRING,
    region STRING,
    sales_amount INT,
    sale_date DATE
);

INSERT INTO sales (id, salesperson, region, sales_amount, sale_date)
VALUES
(1, 'Alice', 'North', 1000, '2023-01-01'),
(2, 'Bob', 'South', 1500, '2023-01-02'),
(3, 'Alice', 'North', 2000, '2023-01-03'),
(4, 'Charlie', 'East', 1200, '2023-01-04'),
(5, 'Bob', 'South', 1800, '2023-01-05'),
(6, 'Alice', 'North', 2500, '2023-01-06'),
(7, 'Charlie', 'East', 1300, '2023-01-07'),
(8, 'Bob', 'South', 2200, '2023-01-08'),
(9, 'Alice', 'North', 3000, '2023-01-09'),
(10, 'Charlie', 'East', 1400, '2023-01-10');

示例数据表:sales

id salesperson region sales_amount sale_date
1 Alice North 1000 2023-01-01
2 Bob South 1500 2023-01-02
3 Alice North 2000 2023-01-03
4 Charlie East 1200 2023-01-04
5 Bob South 1800 2023-01-05
6 Alice North 2500 2023-01-06
7 Charlie East 1300 2023-01-07
8 Bob South 2200 2023-01-08
9 Alice North 3000 2023-01-09
10 Charlie East 1400 2023-01-10
sql 复制代码
---

### 1. `CASE WHEN` 示例
根据销售额给销售人员分类:

```sql
SELECT 
    salesperson,
    sales_amount,
    CASE 
        WHEN sales_amount < 1500 THEN 'Low'
        WHEN sales_amount BETWEEN 1500 AND 2500 THEN 'Medium'
        ELSE 'High'
    END AS sales_category
FROM 
    sales;
运行结果:
salesperson sales_amount sales_category
Alice 1000 Low
Bob 1500 Medium
Alice 2000 Medium
Charlie 1200 Low
Bob 1800 Medium
Alice 2500 Medium
Charlie 1300 Low
Bob 2200 Medium
Alice 3000 High
Charlie 1400 Low

2. SUM(CASE WHEN) 示例

计算每个区域的销售总额:

sql 复制代码
SELECT 
    region,
    SUM(CASE WHEN salesperson = 'Alice' THEN sales_amount ELSE 0 END) AS alice_sales,
    SUM(CASE WHEN salesperson = 'Bob' THEN sales_amount ELSE 0 END) AS bob_sales,
    SUM(CASE WHEN salesperson = 'Charlie' THEN sales_amount ELSE 0 END) AS charlie_sales
FROM 
    sales
GROUP BY 
    region;
运行结果:
region alice_sales bob_sales charlie_sales
North 8500 0 0
South 0 5500 0
East 0 0 3900

3. RANK() 示例

根据销售额对销售人员进行排名:

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank
FROM 
    sales;
运行结果:
salesperson sales_amount sales_rank
Alice 3000 1
Bob 2200 2
Alice 2500 3
Bob 1800 4
Alice 2000 5
Bob 1500 6
Charlie 1400 7
Charlie 1300 8
Alice 1000 9
Charlie 1200 10

4. ROW_NUMBER() 示例

为每个销售人员的销售额分配一个唯一的行号:

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    ROW_NUMBER() OVER (PARTITION BY salesperson ORDER BY sales_amount DESC) AS row_num
FROM 
    sales;
运行结果:
salesperson sales_amount row_num
Alice 3000 1
Alice 2500 2
Alice 2000 3
Alice 1000 4
Bob 2200 1
Bob 1800 2
Bob 1500 3
Charlie 1400 1
Charlie 1300 2
Charlie 1200 3

5. DENSE_RANK() 示例

根据销售额对销售人员进行密集排名(不会跳过排名):

sql 复制代码
SELECT 
    salesperson,
    sales_amount,
    DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS dense_rank
FROM 
    sales;
运行结果:
salesperson sales_amount dense_rank
Alice 3000 1
Bob 2200 2
Alice 2500 3
Bob 1800 4
Alice 2000 5
Bob 1500 6
Charlie 1400 7
Charlie 1300 8
Alice 1000 9
Charlie 1200 10

总结

  • CASE WHEN:用于条件判断,生成新的列。
  • SUM(CASE WHEN):用于按条件汇总数据。
  • RANK():用于排名,允许并列排名并跳过后续名次。
  • ROW_NUMBER():用于生成唯一的行号,即使数据相同也会分配不同行号。
  • DENSE_RANK():用于密集排名,允许并列排名但不跳过后续名次。

通过这些示例和运行结果,可以清晰地展示每个函数的作用和用法!

相关推荐
ideaout技术团队3 小时前
leetcode学习笔记2:多数元素(摩尔投票算法)
学习·算法·leetcode
十铭忘4 小时前
Bug——PaddleX人脸识别报错:Process finished with exit code -1073741819 (0xC0000005)
学习·bug
less is more_09305 小时前
风力发电机输出功率模型综述
笔记·学习·数学建模
丰锋ff5 小时前
2006 年真题配套词汇单词笔记(考研真相)
笔记·学习·考研
洛可可白7 小时前
把 Vue2 项目“黑盒”嵌进 Vue3:qiankun 微前端实战笔记
前端·vue.js·笔记
想唱rap7 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
早睡冠军候选人8 小时前
K8s学习----节点(Node)
运维·学习·云原生·容器·kubernetes
梅见十柒9 小时前
Linux/UNIX系统编程手册笔记:POSIX
linux·服务器·网络·笔记·tcp/ip·udp·unix
NON-JUDGMENTAL9 小时前
《Local_Pdf_Chat_RAG 深度学习笔记:PDF 本地化对话的 RAG 原理与实践》
笔记·pdf
聪明的笨猪猪10 小时前
Java SE “JDK1.8新特性”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试