SQL 实现全字段分组,每组取一条记录,记录满足:组内时间最大,组内不同类型数量求和
1 SELECT
2 TT.CLASS_ID AS "classId",
3 TT.TEMPLATE_ID AS "templateId" ,
4 TT.MSG_CLASS_NAME AS "templateName",
5 TT.MSG_CLASS_CODE AS "templateCode",
6 TT.TEMPLATE_TITLE AS "templateTitle",
7 TT.TEMPLATE_TYPE AS "templateType",
8 TT.TEMPLATE_CONTENT AS "templateContent",
9 TT.MSG_SUBJECT AS "msgSubject",
10 TT.MSG_TITLE AS "msgTitle",
11 TT.MSG_CONTENT AS "msgContent",
12 TT.SEND_TIME AS "sendTime",
13 TT.COUNTNO AS "countNo",
14 TT.TOTAL AS "count" ,
15 TT.ICON AS "icon"
16 FROM
17 (
18 SELECT
19 TEMP.CLASS_ID, TEMP.TEMPLATE_ID , TEMP.ICON , TEMP.MSG_CLASS_NAME, TEMP.MSG_CLASS_CODE, TEMP.TEMPLATE_TITLE , TEMP.TEMPLATE_TYPE , TEMP.TEMPLATE_CONTENT , TEMP2.MSG_SUBJECT , TEMP2.MSG_TITLE , TEMP2.MSG_CONTENT , TEMP2.SEND_TIME , TEMP2.COUNTNO , SUM(TEMP2.COUNTNO) OVER (PARTITION BY TEMP.MSG_CLASS_CODE
20 ORDER BY
21 TEMP2.SEND_TIME DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTAL, ROW_NUMBER() OVER (PARTITION BY TEMP.CLASS_ID
22 ORDER BY
23 TEMP2.SEND_TIME ASC) AS ROWNO
24 FROM
25 (
26 SELECT
27 tamc.CLASS_ID , tamc.ICON , tamc.MSG_CLASS_NAME , tamc.MSG_CLASS_CODE , tamt.TEMPLATE_TYPE , tamt.TEMPLATE_ID , tamt.TEMPLATE_NAME , tamt.TEMPLATE_TITLE , tamt.TEMPLATE_CONTENT
28 FROM
29 MEAB.T_AP_MESSAGE_CLASS tamc
30 LEFT JOIN MEAB.T_AP_CLASS_TEMPLATE tact ON
31 tamc.CLASS_ID = tact.CLASS_ID
32 LEFT JOIN MEAB.T_AP_MESSAGE_TEMPLATE tamt ON
33 tamt.TEMPLATE_ID = tact.TEMPLATE_ID) TEMP
34 LEFT JOIN (
35 SELECT
36 TT.MSG_SUBJECT , TT.MSG_CONTENT , TT.SEND_TIME , TT.BIZ_TYPE , TT.MSG_TITLE , COUNTNO
37 FROM
38 (
39 SELECT
40 tam.MSG_SUBJECT , tam.MSG_CONTENT , tam.SEND_TIME , tam.BIZ_TYPE , tam.MSG_TITLE , ROW_NUMBER() OVER (PARTITION BY tam.BIZ_TYPE
41 ORDER BY
42 tam.SEND_TIME DESC) AS ROWNO , COUNT(1) OVER (PARTITION BY tam.BIZ_TYPE
43 ORDER BY
44 tam.SEND_TIME ASC) AS COUNTNO
45 FROM
46 MEAB.T_APP_MESSAGE tam
47 LEFT JOIN MEAB.T_APP_MESSAGE_SEND tams ON
48 tam.MSG_ID = tams.MESSAGE_ID
49 WHERE
50 tam.MSG_ORIGNAL = 'COL'
51 AND tam.MSG_STATUS = '01'
52 AND tams.SEND_STATUS = '01'
53 AND tams.SEND_OBJECT_NO = '971260') TT
54 WHERE
55 ROWNO = '1' ) TEMP2 ON
56 TEMP2.BIZ_TYPE = TEMP.TEMPLATE_TYPE) TT
57 WHERE
58 TT.ROWNO = 1
问题描述:

参考上图,加入有A,B,C多个大类型,每个类型下面有多个1,2,3等多个中类,中类下面有很多明细记录(数据在多张表)。要求实现:
1,按照大类分组,显示多个表的某些字段(字段不一定在分组参数),
2,中类分组后,统计每个中类分组的记录数count,
3,然后根据大类的分组求中类记录数和(统计大类的下,满足中类要求的所有记录数)。
运行结果:
按照classId进行分组,关联多个表,统计每个类型下面消息最新的记录,同时统计这类型消息的记录数有多少

关键函数:
1 ROW_NUMBER() OVER (PARTITION BY tam.BIZ_TYPE
2 ORDER BY
3 tam.SEND_TIME DESC) AS ROWNO , COUNT(1) OVER (PARTITION BY tam.BIZ_TYPE
4 ORDER BY
5 tam.SEND_TIME ASC) AS COUNTNO
ROWNO = '1' 取时间最大
1 SUM(TEMP2.COUNTNO) OVER (PARTITION BY TEMP.MSG_CLASS_CODE
2 ORDER BY
3 TEMP2.SEND_TIME DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTAL, ROW_NUMBER() OVER (PARTITION BY TEMP.CLASS_ID
4 ORDER BY
5 TEMP2.SEND_TIME ASC) AS ROWNO
相同组内,包含不同类型求和
SQL 实现全字段分组,每组取一条记录,记录满足:组内时间最大,组内不同类型数量求和的更多相关文章
- 【daily】sql分组,每组取N条
数据准备 -- mysql语法 DROP TABLE IF EXISTS `test_group_type`; CREATE TABLE `test_group_type` ( `id` int(11 ...
- MySQL 先按某字段分组,再取每组中前N条记录
按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...
- MYSQL 按某个字段分组,然后取每组前3条记录
先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid 都只有 3 条记录. SQL语句为: SELECT * FROM test main WHERE ...
- sql server 按照字段分组 重新设置组序号
SELECT cpr.Id, cpr.CreateTime, cpr.Number FROM CarParkingRegistration cpr SELECT CONCAT(FORMAT(cpr ...
- 【Teradata SQL】一个字段为空即取另外一个字段(连续取4个字段)-case when
目标:如果col1为空则取col2的值,如果col2也为空则取col3的值,如果col3还为则取col4的值,如果四个字段均为空则取默认值 1.数据准备 create multiset table t ...
- sql 多个字段分组,删除重复记录,保留ID最小的一条
IF OBJECT_ID('cardDetail') IS NOT NULL DROP TABLE cardDetail CREATE TABLE cardDetail ( id ,) PRIMARY ...
- sql 以某个字段分组,另一个字段为参加比较的列,取得前n项的值
假设表A有三个字段 { id int: subject varchar(20): socre int: } 语句为 select * from A x where (select count(*) ...
- sql查询一个字段不同值并返回
sql SELECT COUNT(字段),分组字段,SUM(字段),SUM(字段) FROM 表 GROUP BY 分组字段 java EntityWrapper<ProjectEntity&g ...
- SQL AUTO INCREMENT 字段
Auto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值. 我们可以在表中创建一个 auto- ...
- sql 查询某个字段最长的记录
sql 查询文本字段中值的长度最长的记录 一.函数1.SQL ServerLEN() 函数返回文本字段中值的长度.SELECT LEN(column_name) FROM table_name;2. ...
随机推荐
- <一>关于运算符重载
C++的运算符重载:使对象的运算表现得和编译器内置类型一样 如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加? 这个就是我们要 ...
- ArcGIS 添加Excel数据 报错 ArcGIS Failed to connect to database 外部数据库驱动程序(1)中的意外错误
原因是因为 操作系统安装了一些补丁,卸载即可. 把以下补丁卸载掉即可. win7 <-- KB4041678 , KB4041681 --> SERVER 2008 R2 <-- ...
- <一>对象使用过程中背后调用了哪些方法
代码1 #include <iostream> using namepspace std; class Test { public: Test(int a=10):ma(a){cout&l ...
- 深入浅出OSI七层参考
本篇博客是笔者阅读<图解TCP/IP>所记录下的笔记,有兴趣的朋友可以去看一看这本书. OSI七层参考模型 本小节以电子邮件通信为例,分别来阐述OSI七层模型的每一层是如果进行通信处理 ...
- 前端入门 HTTP协议 HTML简介 head内常见标签 body内常见标签 特殊符号 列表标签 表格标签 表单标签
目录 前端和后端的概念 前端前戏之B/S架构 数据交互的协议 HTTP协议 1.四大特性 1. 基于请求响应 2. 基于TCP.IP作用与应用层之上的协议 3. 无状态 4. 无\短连接 2.数据格式 ...
- jmeter 之修改报告取样间隔时间以及APDEX 区间设置
1.取样间隔时间设置 在jmeter 生成的报告中取样间隔默认设置的是1分钟,而非1秒,故样本间的间隔为1分钟,如下图所示: 取样间隔时间可通过修改bin/user.properties配置文件实现自 ...
- week_10
Andrew Ng 机器学习笔记 ---By Orangestar Week_10 (大数据处理) 1. Learning With Large Datasets 机器学习很多时候都要处理非常多的数据 ...
- css处理渲染的图片变形问题:object-fit: cover
object-fit: cover完美解决!~
- 从源码层面深度剖析Spring循环依赖
作者:郭艳红 以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1.Spring 如何创建 ...
- WCH沁恒 CH37系列芯片选型以及常见问题的处理(CH376/CH378)
选型 型号 接口 功能 备注 电源 CH372 并口 USB_Device 全速 USB 设备接口,兼容 USB V2.0 3.1-3.6 4.2-5.4 CH374 SPI/并口 Host/Devi ...