SQL PARTITION BY用法

文章目录

  • 一、前言
  • 二、案例
  • [三、与group by 对比](#三、与group by 对比)
  • 四、妙用
    • [4.1 接函数](#4.1 接函数)
    • [4.2 行号](#4.2 行号)
    • [4.3 count 另类](#4.3 count 另类)

一、前言

关于同表分组,今天发现Partition By 特好用,

相比于Group By,贵在保留原表所有行+灵活计算

二、案例

对于同表TableA 的不同分组计数,如:

sql 复制代码
SELECT *, 
(SELECT COUNT(1) TableA B  where A.COL1=B.COL1) AS COUNT1
(SELECT COUNT(1) TableA B  where A.COL1=B.COL1 AND  A.COL2=B.COL2 ) AS COUNT2
(SELECT COUNT(1) TableA B  where A.COL1=B.COL1 AND  A.COL2=B.COL2 AND A.COL3=B.COL3) AS COUNT3
FROM TableA A

使用PARTITION BY:

sql 复制代码
SELECT *, 
count(1) OVER  (PARTITION BY COL1) AS COUNT1
count(1) OVER  (PARTITION BY COL1,COL2)  AS COUNT2
count(1) OVER  (PARTITION BY COL1,COL2,COL3)  AS COUNT3
FROM TableA A

代码一下清爽了。

三、与group by 对比

实现计数

sql 复制代码
SELECT *, 
count(1) OVER  (PARTITION BY COL1) AS COUNT1
FROM TableA A

相当于

sql 复制代码
SELECT *, 
(SELECT COUNT(1) TableA B  where A.COL1=B.COL1 group by  COL1) AS COUNT1
FROM TableA A

四、妙用

4.1 接函数

sql 复制代码
SELECT 
    *,
    -- 计算总销
    SUM(amount) OVER (PARTITION BY COL1 ) AS total,
    -- 计算占比(保留2位小数)
    ROUND(COL3 / SUM(COL2 ) OVER (PARTITION BY COL1 ) * 100, 2) AS ratio
FROM TableA ;

4.2 行号

sql 复制代码
SELECT 
    *,
   ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2 DESC) 
FROM TableA ;

多一个行号列 1、2、3、4、5

4.3 count 另类

count 会遍历所有数据, 但是ROW_NUMBER()-1 只会取一条,

这未曾不是一种优化

sql 复制代码
SELECT 
    *,
   ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2 DESC) -1  as count1 
FROM TableA ;
--备注
SELECT 
    *,
   CASE when count1=0 Then 1 else 2 END  AS  '新产品'
FROM TableA ;

当然 还可以 MAX(count1)-1 作为 总条数的取值。

相关推荐
RestCloud4 小时前
借助ETL工具,实现AI智能体+数据的落地
数据仓库·人工智能·sql·etl·etlcloud·数据集成平台·java脚本
小二·5 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手5 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌5 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
蓝天下的守望者6 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
上海云盾-小余6 小时前
网站频繁遭遇 SQL 注入溯源与原生漏洞修复全流程总结
数据库·sql
数据库小学妹6 小时前
国家区域医疗中心国产化改造实战:数据库选型、跨院区数据互通与踩坑经验
数据库·国产数据库·数据库选型·医疗信息化·信创数据库·医疗信创
AllData公司负责人7 小时前
数据库同步平台|AIIData数据中台实现OceanBase、达梦数据库、OpenGauss、人大金仓、Hive、TDengine 一键接入Doris
大数据·数据库·hive·mysql·oceanbase·tdengine
2603_954708318 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全