分组查询最晚一条数据(ORACLE)

现有客户表,交费表,需查询每个存在交费记录客户的最后一笔交费信息

这里提供两种方式

注:客户不会在同一时间有两条交费,SQL可直接执行

--查询客户名称,最后一笔交费时间,以及最后一笔交费金额
WITH
--客户表:客户id,客户名称
a AS(
SELECT 'a1' aid, '张三' aname FROM dual
UNION ALL 
SELECT 'a2', '李四' FROM dual
UNION ALL 
SELECT 'a3', '王五' FROM dual
),
--交费表:交费ID,客户ID,交费时间(以数字代替,数字越大时间越晚),交费金额
b AS(
SELECT 'b1' bid,'a1' aid, '1' btime, 10 bnum FROM dual
UNION ALL 
SELECT 'b2','a1', '2',30 FROM dual
UNION ALL 
SELECT 'b3', 'a1', '3',40 FROM dual
UNION ALL 
SELECT 'b4', 'a2', '1',40 FROM dual
UNION ALL 
SELECT 'b5', 'a2', '3',60 FROM dual
UNION ALL 
SELECT 'b6', 'a3', '1',50 FROM dual
)
--方式一:子查询
/*SELECT a.aname,b1.bnum,b1.btime
FROM b b1
JOIN (SELECT b.aid,MAX(b.btime) btimeFROM b GROUP BY b.aid) b2 ON b2.aid = b1.aid AND b2.btime = b1.btime
JOIN a ON b1.aid = a.aid
ORDER BY 1,2,3
*/
--方式二:分析函数
/*SELECT aname,bnum,btime
FROM (
SELECT a.aname,b.bnum,b.btime,
row_number() OVER (partition by b.aid order by b.btime desc) rn
FROM b
JOIN a ON a.aid = b.aid
)
WHERE rn = 1
ORDER BY 1,2,3
--方式三:NOT EXISTS
SELECT a.aname,b.bnum,b.btime 
FROM a
JOIN b ON b.aid = a.aid
AND NOT EXISTS(
SELECT 1 FROM b b1
WHERE b1.aid = b.aid
AND b1.btime > b.btime)
ORDER BY 1,2,3*/
--方式四:开窗函数
SELECT DISTINCT a.aname,
first_value(b.bnum) OVER (partition by b.aid order by b.btime DESC) bnum,
last_value(b.btime) OVER (partition by b.aid) btime
FROM b
JOIN a ON a.aid = b.aid
ORDER BY 1,2,3

查询结果如下

first_value和last_value用法不同可以参照

Oracle分析函数之FIRST_VALUE和LAST_VALUE

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

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

相关文章

ORACLE循环中使用序列

在批量生成数据时,经常会用到序列的Nextval,今天碰到了这样的情况,日常记录,下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…

mysql001创建数据库

-- 注释,ctrl/ -- 查询所有数据库; show DATABASES; -- 创建数据库; CREATE DATABASE studb; -- 切换数据库; USE studb; -- 删除数据库 DROP DATABASE studb;

mysql002创建表

-- 创建student表 DDL CREATE TABLE stdent( sno int(3), name VARCHAR(55), sex CHAR(2), age int, dtdate date, classname VARCHAR(55), email VARCHAR(55) ) -- 查询表中数据 DQL SELECT * FROM stdent;

mysql003操作表DDL

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 在表中添加一列 DDL -- 新增列 默认添加到最后 ALTER TABLE stdent add score DOUBLE(4,1); -- 新增一列 在表中开头添加 ALTER TABLE stdent add score2 double(5,1) first; -- 在指定列后面添…

mysql005约束.列级别

-- 列级约束 -- sno 主键:唯一,不为空,自增 -- name 非空 -- sex 非空,默认值,只有男女 -- age 0-30岁 -- score 非空 -- dtdate 非空 -- classname 非空 -- email唯一 -- 创建表,增加列级约束 …

hdu.1430.魔板(bfs + 康托展开)

魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170 Accepted Submission(s): 455 Problem Description在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方…

mysql006添加外键约束

-- 添加外键 -- 建立主表,班级表 CREATE TABLE class( cno int PRIMARY key auto_increment, cname VARCHAR(55) ) SELECT * FROM class; -- 建立从表,学生表 CREATE table stu( sno int PRIMARY KEY auto_increment, sname VARCHAR(55), sex ch…

Circle-Progress-View

https://github.com/jakob-grabner/Circle-Progress-View 转载于:https://www.cnblogs.com/eustoma/p/4507476.html

elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇

大家好,我是泥腿子安尼特,5个月没在李佬都公众号更新文章了。上一篇,大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的。今天就讲讲这个最重要的E——基于Lucene的搜索引擎ElasticSearch(后面简称ES)。最近刚搬家,没想到隔…

mysql004操作表.增删改

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 新增数据 这种写法数据的循序和数据库的字段循序保持一致。 INSERT INTO stdent values (1,"张三","男",25,"2021.1.1","java","123qq.com"); --…

纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!

问:我也是钣金人,怎么加入组织?答:点标题下方蓝字“钣金家园光纤激光切割机之所以能在市场快速站稳脚跟并且逐步替代传统切割工艺,是由于其在各方面独具优势,那么他到底优秀在哪里呢?我们把CO2激…

mysql007.算数运算.别名.去重.排序

-- 创建DEPT表 CREATE TABLE DEPT( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); -- 查询DEPT表 SELECT * FROM DEPT; -- 修改表,添加主键 ALTER TABLE DEPT add CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO); -- 查询表结构。 desc DEPT; …

c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍

1. 数据透传蓝牙模块可以通过串口(SPI、IIC)和MCU控制设备进行数据传输。蓝牙模块可以做为主机和从机。主机就是能够搜索别的蓝牙模块并主动建立连接,从机则不能主动建立连接,只能等别人连接自己。2. 低功耗低功耗蓝牙(Bluetooth Low Energy)&#xff0c…

Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg

打开eclipse时出现Error: could not open C:\Program Files\Java\jre7\lib\i586\jvm.cfg’) 删除 c:\windows\system32\java, c:\windows\system32\javaw, c:\windows\system32\javaws, 如果是64位系统,还要删除 c:\windows\SysWOW64\java&am…

java项目001.双色球游戏

package Suangseq; //双色球游戏制作。 import java.awt.SystemColor; import java.util.Arrays; import java.util.Scanner; public class TextA { public static void main(String[] args) { boolean flagfalse;//定义一个布尔类型的变量。 int[] mynull;//定义一个变量 in…

华为手机30s桌面循环滑动_华为发飙了!麒麟820+双模5G,从2699元跌至2499元,超出消费者预期...

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注图文来源网络,侵删 …

混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...

其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqli…

mysql008where.or.in查询

-- 创建EMP表 CREATE TABLE EMP ( EMPNO int(4) PRIMARY KEY, ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT(4), HIREDATE DATE, SAL DOUBLE(7,2), COMM DOUBLE(7,2), DEPTNO INT(2) ); -- where查询 语句 SELECT * from emp; SELECT * FROM DEPT; SELECT * FROM…

微信接口请求次数_接口签名验证常用方案

前面的文章说了接口数据如何获取,今天就来聊聊接口数据的安全问题。说到接口加密验证,通常都称作“签名”,类似于名人的个性签名,让其它人无法模仿。比如说请求接口删除自己写的文章,又或者请求接口查询自己的帐单明细…

mysql009模糊查询like.是否为null

-- 创建EMP表 CREATE TABLE EMP ( EMPNO int(4) PRIMARY KEY, ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT(4), HIREDATE DATE, SAL DOUBLE(7,2), COMM DOUBLE(7,2), DEPTNO INT(2) ); -- where查询 语句 SELECT * from emp; -- 模糊查询 -- 搜索emp表中还有A的…