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 实现全字段分组,每组取一条记录,记录满足:组内时间最大,组内不同类型数量求和的更多相关文章

  1. 【daily】sql分组,每组取N条

    数据准备 -- mysql语法 DROP TABLE IF EXISTS `test_group_type`; CREATE TABLE `test_group_type` ( `id` int(11 ...

  2. MySQL 先按某字段分组,再取每组中前N条记录

    按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...

  3. MYSQL 按某个字段分组,然后取每组前3条记录

    先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid  都只有 3 条记录.   SQL语句为: SELECT   * FROM   test main WHERE   ...

  4. sql server 按照字段分组 重新设置组序号

      SELECT cpr.Id, cpr.CreateTime, cpr.Number FROM CarParkingRegistration cpr SELECT CONCAT(FORMAT(cpr ...

  5. 【Teradata SQL】一个字段为空即取另外一个字段(连续取4个字段)-case when

    目标:如果col1为空则取col2的值,如果col2也为空则取col3的值,如果col3还为则取col4的值,如果四个字段均为空则取默认值 1.数据准备 create multiset table t ...

  6. sql 多个字段分组,删除重复记录,保留ID最小的一条

    IF OBJECT_ID('cardDetail') IS NOT NULL DROP TABLE cardDetail CREATE TABLE cardDetail ( id ,) PRIMARY ...

  7. sql 以某个字段分组,另一个字段为参加比较的列,取得前n项的值

    假设表A有三个字段 { id int: subject varchar(20): socre int: } 语句为 select * from A  x where (select count(*) ...

  8. sql查询一个字段不同值并返回

    sql SELECT COUNT(字段),分组字段,SUM(字段),SUM(字段) FROM 表 GROUP BY 分组字段 java EntityWrapper<ProjectEntity&g ...

  9. SQL AUTO INCREMENT 字段

    Auto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值. 我们可以在表中创建一个 auto- ...

  10. sql 查询某个字段最长的记录

    sql  查询文本字段中值的长度最长的记录 一.函数1.SQL ServerLEN() 函数返回文本字段中值的长度.SELECT LEN(column_name) FROM table_name;2. ...

随机推荐

  1. <一>关于运算符重载

    C++的运算符重载:使对象的运算表现得和编译器内置类型一样 如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加? 这个就是我们要 ...

  2. ArcGIS 添加Excel数据 报错 ArcGIS Failed to connect to database 外部数据库驱动程序(1)中的意外错误

    原因是因为 操作系统安装了一些补丁,卸载即可. 把以下补丁卸载掉即可. win7 <-- KB4041678 , KB4041681  --> SERVER 2008 R2 <-- ...

  3. <一>对象使用过程中背后调用了哪些方法

    代码1 #include <iostream> using namepspace std; class Test { public: Test(int a=10):ma(a){cout&l ...

  4. 深入浅出OSI七层参考

    本篇博客是笔者阅读<图解TCP/IP>所记录下的笔记,有兴趣的朋友可以去看一看这本书. OSI七层参考模型 ​ 本小节以电子邮件通信为例,分别来阐述OSI七层模型的每一层是如果进行通信处理 ...

  5. 前端入门 HTTP协议 HTML简介 head内常见标签 body内常见标签 特殊符号 列表标签 表格标签 表单标签

    目录 前端和后端的概念 前端前戏之B/S架构 数据交互的协议 HTTP协议 1.四大特性 1. 基于请求响应 2. 基于TCP.IP作用与应用层之上的协议 3. 无状态 4. 无\短连接 2.数据格式 ...

  6. jmeter 之修改报告取样间隔时间以及APDEX 区间设置

    1.取样间隔时间设置 在jmeter 生成的报告中取样间隔默认设置的是1分钟,而非1秒,故样本间的间隔为1分钟,如下图所示: 取样间隔时间可通过修改bin/user.properties配置文件实现自 ...

  7. week_10

    Andrew Ng 机器学习笔记 ---By Orangestar Week_10 (大数据处理) 1. Learning With Large Datasets 机器学习很多时候都要处理非常多的数据 ...

  8. css处理渲染的图片变形问题:object-fit: cover

    object-fit: cover完美解决!~

  9. 从源码层面深度剖析Spring循环依赖

    作者:郭艳红 以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1.Spring 如何创建 ...

  10. WCH沁恒 CH37系列芯片选型以及常见问题的处理(CH376/CH378)

    选型 型号 接口 功能 备注 电源 CH372 并口 USB_Device 全速 USB 设备接口,兼容 USB V2.0 3.1-3.6 4.2-5.4 CH374 SPI/并口 Host/Devi ...