SQL分区BY子句

在SQL中,PARTITION BY子句允许我们根据一个或多个列将给定查询的结果集划分或分区为不同的组。生成的分区可能非常有用,特别是当您需要对每个分区(单独)执行计算或在每个组中应用聚合函数时。

在本教程中,我们将了解SQL中PARTITION BY子句的工作原理,并了解如何使用它将数据划分为更细粒度的子集。

语法:

让我们从PARTITION BY子句的语法开始。语法可能取决于你使用它的上下文,但这里是一般语法:

SELECT column1, column2,…



OVER (PARTITION BY partition_column1, partition_column2,…)



从table_name

给定的语法表示以下元素:

  1. column1、column2——这指的是我们希望包含在结果集中的列。
  2. PARTITION BY columns——这个子句定义了我们希望如何对数据进行分区或分组。

样本数据

让我们用一个示例数据创建一个基本表,以演示如何使用PARTITION BY子句。对于本例,让我们创建一个存储产品信息的基本表。

创建表


INT主键AUTO_INCREMENT;


product_name VARCHAR (255),


类别VARCHAR (255),


price DECIMAL(10,2),


量INT,


expiration_date日期,


条形码长整型数字


);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


值('厨师帽25cm',


“面包房”,


24.67,


57岁的


“2023-09-09”,


2854509564204);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值(“鹌鹑蛋罐头”、


“储藏室”,


17.99,


67年,


“2023-09-29”,


1708039594250);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值(“咖啡-蛋诺卡布奇诺”,


“面包房”,


92.53,


10,


“2023-09-22”,


8704051853058);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值('梨-多刺',


“面包房”,


65.29,


48,


“2023-08-23”,


5174927442238);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值(“意面-天使的头发”,


“储藏室”,


48.38,


59岁的


“2023-08-05”,


8008123704782);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值('Wine - Prosecco Valdobiaddene');


“生产”,


44.18,


3,


“2023-03-13”,


6470981735653);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值(“糕点-法式迷你什锦”,


“储藏室”,


36.73,


52,


“2023-05-29”,


5963886298051);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值('橙子罐头,普通话',


“生产”,


65.0,


1,


“2023-04-20”,


6131761721332);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


价值(“猪肩肉”、


“生产”,


55.55,


73年,


“2023-05-01”,


9343592107125);



插入



产品(product_name,


类别,


价格,


量,


expiration_date,


条形码)


value(“Dc Hikiage Hira Huba”,


“生产”,


56.29,


53岁,


“2023-04-14”,


3354910667072);

设置好样例数据之后,就可以继续使用PARTITION BY子句了。

基本用法

假设我们想要计算上表中每个产品类别的总项目数。我们可以使用PARTITION BY将项目划分为唯一的类别,然后确定每个类别中数量的总和。

示例如下:

选择


product_name,


类别,


量,


SUM(数量)OVER(按类别划分)作为total_items



产品;

注意,在给定的示例中,我们使用“category”列对数据进行分区。然后使用SUM()聚合函数分别确定每个类别中的项目总数。结果显示每个类别中的项目总数。

使用PARTITION BY子句

总而言之,PARTITION BY子句最常见的用例是与窗口函数结合使用。窗函数分别应用于每个分区。

与PARTITION BY一起使用的一些常用窗口函数包括:

  • SUM() -计算每个分区中列的和。
  • AVG() -计算每个分区内列的平均值。
  • COUNT() -计算每个分区内的行数。
  • ROW_NUMBER() -为每个分区内的每一行分配唯一的行号。
  • RANK() -为每个分区内的每一行分配一个秩。
  • DENSE_RANK() -为每个分区内的每一行分配一个密集的秩。
  • NTILE() -在每个分区中将数据划分为分位数。

就是这样!

结论

在本教程中,我们学习了如何使用SQL中的PARTITION BY子句将数据划分为不同的段,然后分别对每个生成的分区应用特定的操作。