sql partition by和rank的统计用法

news2025/3/1 3:32:04

问题背景

最近公司有个项目需要用到某种特殊的统计用法, 例如从所有的数据中找出每个账号最新的一条余额信息(根据某个关键信息进行排序并获取排序值最高的记录)。
当时用的是非常普通的语句,也就是多个子查询嵌套select出每个账号第一条的id,然后left join会主表获取

数据准备

在这里插入图片描述
在这里插入图片描述
执行以下sql来初始化表格和数据

-- ----------------------------
-- Table structure for test_cust_acct
-- ----------------------------
DROP TABLE IF EXISTS "public"."test_cust_acct";
CREATE TABLE "public"."test_cust_acct" (
  "account_number" varchar(32) COLLATE "pg_catalog"."default",
  "customer_id" varchar(32) COLLATE "pg_catalog"."default"
)
;

-- ----------------------------
-- Records of test_cust_acct
-- ----------------------------
INSERT INTO "public"."test_cust_acct" VALUES ('18522222', 'CNC_10010');
INSERT INTO "public"."test_cust_acct" VALUES ('804461110', 'WOM_10086');


/*
 Navicat Premium Data Transfer
 by https://zhengkai.blog.csdn.net/
*/


-- ----------------------------
-- Table structure for test_intraday
-- ----------------------------
DROP TABLE IF EXISTS "public"."test_intraday";
CREATE TABLE "public"."test_intraday" (
  "_id" int4 NOT NULL,
  "account_number" varchar(32) COLLATE "pg_catalog"."default",
  "amount" numeric(12,2),
  "currency" varchar(12) COLLATE "pg_catalog"."default",
  "balance_date" date
)
;

-- ----------------------------
-- Records of test_intraday
-- ----------------------------
INSERT INTO "public"."test_intraday" VALUES (1, '804461110', 12315.00, 'CNY', '2023-05-27');
INSERT INTO "public"."test_intraday" VALUES (2, '18522222', 45611.11, 'HKD', '2023-05-27');
INSERT INTO "public"."test_intraday" VALUES (3, '18522222', 45622.22, 'HKD', '2023-05-28');
INSERT INTO "public"."test_intraday" VALUES (4, '18522222', 45633.33, 'HKD', '2023-06-01');
INSERT INTO "public"."test_intraday" VALUES (5, '804461110', -54321.00, 'CNY', '2023-06-01');

-- ----------------------------
-- Primary Key structure for table test_intraday
-- ----------------------------
ALTER TABLE "public"."test_intraday" ADD CONSTRAINT "test_intraday_pkey" PRIMARY KEY ("_id");

补习班

什么是partition by 和 rank ?

  1. 一旦各种开窗函数使用partition by后,需要明确的是,函数会对每个分区独立处理。
    avg(page) over(partition by book)
    假如整体是对阿利波特七部曲,则该函数是求出每一部哈利波特的平均页码数。

  2. rank是T_sql 函数,rank函数返回结果集分区内指定字段的值的排名,指定字段的值的排名是相关行之前的排名加一。

解决方案与SQL实战

  1. 第一步,先查出所有的记录
    在这里插入图片描述
-- START
with myresult as (
select ca.*,i.* from test_cust_acct ca 
INNER JOIN test_intraday i on ca.account_number=i.account_number
where ca.customer_id='CNC_10010'
)

select * FROM myresult;

让我们explain一下
在这里插入图片描述

  1. 第二步,加上partition by 和 rank 获取排序

在这里插入图片描述

-- AFTER
with myresult as (
select i.*,rank() over (partition by i.account_number ORDER BY i.account_number,i.balance_date desc) from test_cust_acct ca 
INNER JOIN test_intraday i on ca.account_number=i.account_number
where ca.customer_id in ('CNC_10010','WOM_10086')
)

select * FROM myresult;

在这里插入图片描述
让我们继续explain一下,
在这里插入图片描述
3. 第三步,之找到rank为1的也就是所有account最新一条的数据。

-- FINAL
with myresult as (
select i.*,rank() over (partition by i.account_number ORDER BY i.account_number,i.balance_date desc) from test_cust_acct ca 
INNER JOIN test_intraday i on ca.account_number=i.account_number
where ca.customer_id in ('CNC_10010','WOM_10086')
)

select * FROM myresult where rank=1;

在这里插入图片描述

对比

--old
select ii.* from (
select max(myresut._id) as _id ,myresut.account_number,max(myresut.balance_date) as balance_date from (select ca.customer_id,i.* from test_cust_acct ca 
INNER JOIN test_intraday i on ca.account_number=i.account_number 
where ca.customer_id in ('CNC_10010','WOM_10086')) myresut
GROUP BY myresut.account_number
) finalresult
left JOIN test_intraday ii on finalresult.account_number=ii.account_number and ii._id=finalresult._id;

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python下载jieba:优化中文分词的必备工具

Python下载jieba:优化中文分词的必备工具 在中文自然语言处理的领域中,分词是一项基础且重要的任务。jieba是一个优秀的中文分词组件,它支持三种分词模式,并且具有高效、准确、易用等优点。本文将介绍如何通过Python来下载jieba&…

chatgpt赋能python:Python中8//3**2*10的解析与运算

Python中8//3**2*10的解析与运算 Python是一种高效,多范式,解释性编程语言,广泛用于Web开发,数据科学,人工智能等领域。在Python的运算中,有一个8//3**2*10的表达式,本篇文章将对其进行解析与运…

Springboot 配置文件脱敏的实践

写作目的 数据安全这块还是挺严重的,尤其是自己专注于业务开发,不能总停留在一个地方,还要关注其他的一些问题,比如数据安全。 配置脱敏 实现配置的脱敏我使用了Java的一个加解密工具Jasypt。该工具支持对称加密和非对称加密。…

pytorch基础学习-tensorboardX

最近训练总是出问题,听取建议,在pytorch环境下引入了tensorboard 1、安装tensorboardX tensorboardX是在tensorboard前提下进行安装的,所以我们需要先安装tensorboard pip install tensorboardpip install tensorboardX2、简单使用 这里我…

应急响应-windows

win系统常见的安全事件 1.病毒,木马,蠕虫事件 2.web服务器入侵事件或第三方服务入侵事件 3.系统入侵事件,用win漏洞入侵系统,利用弱口令等。 4.网络攻击事件,如DDos,ARP欺骗等。 win系统安全事件发现的…

基于自适应反馈调节因子的阿基米德优化算法(IAOA)-附代码

基于自适应反馈调节因子的阿基米德优化算法(IAOA) 文章目录 基于自适应反馈调节因子的阿基米德优化算法(IAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 佳点集种群初始化2.2 自适应反馈调节因子2.3 莱维旋转变换策略 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&…

软考A计划-试题模拟含答案解析-卷七

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Maven学习笔记(单一架构案例)22版

第一节 创建工程,引入依赖 1 架构 ①架构的概念 『架构』其实就是『项目的结构』,只是因为架构是一个更大的词,通常用来形容比较大规模事物的结构。 ②单一架构 单一架构也叫『all-in-one』结构,就是所有代码、配置文件、各种…

基于hdoop的短视频用户画像研究_kaic

基于hadoop的短视频用户画像研究 摘 要 在这个互联网迅速发展的时代,网络和信息技术都跟上了时代的潮流,在互联网中的用户数据也出现了爆炸性的增长。用户的各种日常行为都通过互联网被记录下来,对于所有的互联网企业来说,想要从…

TCP报文中序列号的作用

TCP(传输控制协议)中的序列号用于标识TCP报文段中的数据部分。每个TCP报文段都包含一个序列号字段,该字段指示了报文段中第一个字节的序号。在后续的报文段中,序列号将递增,以指示下一个字节的序号。 TCP序列号是一个…

升级Springboot2.7.11之后内嵌tomcat启动成功, 但访问任何接口都是404

背景 最近项目在升级JDK17, 但原先低版本Springboot不能识别jdk17编译的字节码, 为了能够使用JDK17的语法, 因此对SpringBoot也做了升级, 直接升级到了SpringBoot 2.7.11版本. 对一些变更修改升级完成后, 本地启动服务运行, 一切正常!!! 于是发布到公司的容器环境运行, 发布平…

queue的常见接口说明(基于c++标准库的STL)

前言 队列是一种容器适配器,专门用于先进先出(FIFO)的操作中 ,其容器从一端插入数据,从另一端取出数据。队列作为一种容器适配器实现,容器适配器即将特定的容器封装起来,queue提供一组特定的成员…

LBM-BGK计算泊肃叶流动

LBM在计算泊肃叶流动时,需要添加外力项,这部分网上没什么资料,仅有的资料也写的模糊不清,这里点名批评这个知乎博文。 有些地方字母都对不上。。。 本站上也有一篇博文,写的也比较一般,但是代码是多松弛MR…

测试C#分词工具jieba.NET(续2:其它用法)

jieba.NET除分词和关键词提取功能之外,还有一些其它用法,本文基于参考文献学习并记录。 设置停用词 提取关键词时,部分词语可能不重要或者并非所需的词语,此时可以通过设置停用词,在提取关键词时过滤掉指定的停用词。…

【笔记整理】图神经网络学习

【笔记整理】图神经网络学习 文章目录 【笔记整理】图神经网络学习一、GNN简介1、图结构 & 图基础算法1)引言("非欧几何, 处理图数据的NN")2)图基本概念 & 分类("邻接矩阵, 图结构分类"&a…

搭建springboot工程_学习笔记

2.搭建springboot环境 2.1 使用maven项目 在pox.xml文件中加入parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version></parent>在pom…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…

为什么要“内卷”创始人?如何内卷?

受疫情影响&#xff0c;近几年各个行业都受到很大的冲击&#xff0c;同时有许多知识创业者反而逆势增长&#xff0c;这是为什么呢&#xff1f;因为有一个好的领导者&#xff01;一家企业的发展&#xff0c;和创始人的心力和决心紧密联系着&#xff0c;只有好的将军才能带领出好…

【社群运营】关于社群运营的一些学习和思考

社群运营 运营流程&#xff08;自己&#xff09;背景流程过去经验1.你觉得社群最重要的价值是什么&#xff1f;对个人对DW 2.学习社群组织好哪些环节你觉得非常重要&#xff1f;3.这些环节有没有比较好的运营经验/方法&#xff1f;价值共鸣情感共鸣精神共鸣 社群总结 运营流程&…

《数据库应用系统实践》------ 超市管理系统

系列文章 《数据库应用系统实践》------ 超市管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#xff…