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. 【OpenStack云平台】搭建openstack云平台

    1. 系统镜像 安装运行环境系统要求为CentOS7.5,内核版本不低于3.10. CentOS-7.5-x86_64-DVD-1804.iso Chinaskill_Cloud_iaas.iso 2 ...

  2. TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频

    一.序言 在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单.多级目录.多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率. 本文将基于 ...

  3. 关于CSDN博客上传图片的接口研究

    代码实现 import requests from requests_toolbelt import MultipartEncoder import urllib.parse fields = { ' ...

  4. 【Java SE进阶】Day03 数据结构、List、Set、Collections

    一.数据结构 1.红黑树 根黑子黑红子黑 接近平衡树(左右孩子数量相同),查询叶子快慢次数不超过2倍 二.List 1.概述 元素有序 线性存储 带有索引 可以重复 2.常用方法 增:add(I,E) ...

  5. 解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 在前面的几篇文章中,我们一起聊了下本地 ...

  6. Python数据类型+运算符

    Python基础数据类型 上期练习讲解 # 练习一.想办法打印出jason l1 = [11, 22, 'kevin', ['tony', 'jerry', [123, 456, 'jason'] ] ...

  7. echarts map地图中绘制浙江省市区县乡镇多级联动边界下钻的最新geojson数据文件获取和更新

    目录 ECharts Map地图的显示 GeoJSON数据文件获取 在ECharts中绘制浙江省的数据 ECharts Map地图的显示 ECharts支持地理坐标显示,专门提供了一个geo组件,在s ...

  8. DenseNet 论文解读

    目录 目录 摘要 网络结构 优点 代码 问题 参考资料 摘要 ResNet 的工作表面,只要建立前面层和后面层之间的"短路连接"(shortcut),就能有助于训练过程中梯度的反向 ...

  9. python函数及算法

    算法二分法 二分算法图 什么是算法? ​ 算法是高效解决问题的办法. 需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字 # 定义一个无序的列表 nums = [3,4,5,67,8,9,12 ...

  10. Nmap脚本

    Nmap的脚本默认存放在Nmap的安装路径的scripts文件夹下Nmap的脚本主要分为以下几类 Auth:负责处理鉴权证书(绕过鉴权)的脚本 Broadcast:在局域网内探查更多服务的开启情况,如 ...