1. 1 SELECT
  2. 2 TT.CLASS_ID AS "classId",
  3. 3 TT.TEMPLATE_ID AS "templateId" ,
  4. 4 TT.MSG_CLASS_NAME AS "templateName",
  5. 5 TT.MSG_CLASS_CODE AS "templateCode",
  6. 6 TT.TEMPLATE_TITLE AS "templateTitle",
  7. 7 TT.TEMPLATE_TYPE AS "templateType",
  8. 8 TT.TEMPLATE_CONTENT AS "templateContent",
  9. 9 TT.MSG_SUBJECT AS "msgSubject",
  10. 10 TT.MSG_TITLE AS "msgTitle",
  11. 11 TT.MSG_CONTENT AS "msgContent",
  12. 12 TT.SEND_TIME AS "sendTime",
  13. 13 TT.COUNTNO AS "countNo",
  14. 14 TT.TOTAL AS "count" ,
  15. 15 TT.ICON AS "icon"
  16. 16 FROM
  17. 17 (
  18. 18 SELECT
  19. 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. 20 ORDER BY
  21. 21 TEMP2.SEND_TIME DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTAL, ROW_NUMBER() OVER (PARTITION BY TEMP.CLASS_ID
  22. 22 ORDER BY
  23. 23 TEMP2.SEND_TIME ASC) AS ROWNO
  24. 24 FROM
  25. 25 (
  26. 26 SELECT
  27. 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. 28 FROM
  29. 29 MEAB.T_AP_MESSAGE_CLASS tamc
  30. 30 LEFT JOIN MEAB.T_AP_CLASS_TEMPLATE tact ON
  31. 31 tamc.CLASS_ID = tact.CLASS_ID
  32. 32 LEFT JOIN MEAB.T_AP_MESSAGE_TEMPLATE tamt ON
  33. 33 tamt.TEMPLATE_ID = tact.TEMPLATE_ID) TEMP
  34. 34 LEFT JOIN (
  35. 35 SELECT
  36. 36 TT.MSG_SUBJECT , TT.MSG_CONTENT , TT.SEND_TIME , TT.BIZ_TYPE , TT.MSG_TITLE , COUNTNO
  37. 37 FROM
  38. 38 (
  39. 39 SELECT
  40. 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. 41 ORDER BY
  42. 42 tam.SEND_TIME DESC) AS ROWNO , COUNT(1) OVER (PARTITION BY tam.BIZ_TYPE
  43. 43 ORDER BY
  44. 44 tam.SEND_TIME ASC) AS COUNTNO
  45. 45 FROM
  46. 46 MEAB.T_APP_MESSAGE tam
  47. 47 LEFT JOIN MEAB.T_APP_MESSAGE_SEND tams ON
  48. 48 tam.MSG_ID = tams.MESSAGE_ID
  49. 49 WHERE
  50. 50 tam.MSG_ORIGNAL = 'COL'
  51. 51 AND tam.MSG_STATUS = '01'
  52. 52 AND tams.SEND_STATUS = '01'
  53. 53 AND tams.SEND_OBJECT_NO = '971260') TT
  54. 54 WHERE
  55. 55 ROWNO = '1' ) TEMP2 ON
  56. 56 TEMP2.BIZ_TYPE = TEMP.TEMPLATE_TYPE) TT
  57. 57 WHERE
  58. 58 TT.ROWNO = 1

问题描述:

参考上图,加入有A,B,C多个大类型,每个类型下面有多个1,2,3等多个中类,中类下面有很多明细记录(数据在多张表)。要求实现:

1,按照大类分组,显示多个表的某些字段(字段不一定在分组参数),

2,中类分组后,统计每个中类分组的记录数count,

3,然后根据大类的分组求中类记录数和(统计大类的下,满足中类要求的所有记录数)。

运行结果:

  按照classId进行分组,关联多个表,统计每个类型下面消息最新的记录,同时统计这类型消息的记录数有多少

关键函数:

  1. 1 ROW_NUMBER() OVER (PARTITION BY tam.BIZ_TYPE
  2. 2 ORDER BY
  3. 3 tam.SEND_TIME DESC) AS ROWNO , COUNT(1) OVER (PARTITION BY tam.BIZ_TYPE
  4. 4 ORDER BY
  5. 5 tam.SEND_TIME ASC) AS COUNTNO

ROWNO = '1' 取时间最大

  1. 1 SUM(TEMP2.COUNTNO) OVER (PARTITION BY TEMP.MSG_CLASS_CODE
  2. 2 ORDER BY
  3. 3 TEMP2.SEND_TIME DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTAL, ROW_NUMBER() OVER (PARTITION BY TEMP.CLASS_ID
  4. 4 ORDER BY
  5. 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. 数学建模经验分享会For浙商大管工学院

    数学建模介绍 数学建模与数学 数学建模和数学没有必然的关系 一个队里至少有一个数学较好 注重运筹学.统计学这两门课 数学建模做什么 时间:一般每年9月开学三周内 时长:3天3夜 目标:完成一份排版精美 ...

  2. python解释器下载与安装指导手册

    python解释器下载与安装指导手册 1.python解释器 1.1下载地址 1 https://www.python.org/ 1.2.python解释器下载 1.3.python解释器主流版本 p ...

  3. Linux面试题2:网络IO模型 & IO多路复用

    网络IO 先确定一下范围,我们讨论的都是网络IO,现阶段计算机早已经从CPU密集型转换成网络IO密集型,所以网络io的类型对于服务响应而言更重要. 五种IO模型 依据Unix的IO分类,网络IO分为五 ...

  4. Kafka教程(三):原理及存储

    一.思维导图 1.实时更新连接 https://www.mubucm.com/doc/1GRE2U7qYuj 2.思维导图图片 二.具体内容   8.系统架构   架构推导   拓扑结构   多对多 ...

  5. 2.9:数据交换-csv、Excel、json、爬虫、Tushare获取数据

    〇.任务 1. 使用Python基础文件读写函数完成CSV文件的处理: 2. 使用标准CSV库完成CSV文件的处理: 3. 使用Excel库完成Excel文件的处理: 4. Python数据结构和Js ...

  6. Hexo+Gitee免费搭建静态博客

    前言 这是一篇利用 Gitte Pages + hexo 搭建属于自己博客的教程,也是自己这个博客搭建好以后的第一篇文章,搭建的过程中也参考了各路大佬的文章,期间遇到了一些问题,所以写这一篇文章即是记 ...

  7. windows 、linux文件互传-FileZilla

    1.下载免安装FileZilla并解压 2.打开.exe文件 3.点击左上角的文件->站点管理 4.点击新站点->进行配置相应的服务地址信息 5.连接上服务后,若需要将windows中的文 ...

  8. week_9(异常检测)

    Andrew Ng 机器学习笔记 ---By Orangestar Week_9 This week, we will be covering anomaly detection which is w ...

  9. Mapper的动态代理

    可以自动生产接口的实现类 ,所以就不需要再写daoImpl这个实现类了, 直接使用sqlSession.getMapper自动生成实现类 @Before 此注解的目的是为了将@Befoe 作为首先执行 ...

  10. 【转载】EXCEL VBA 自定义排序的三种方法

    何谓自定义排序,就是按指定的顺序对数据源进行排序呗.   共分享了三种方法: 第1种方法是系统自带的OrderCustom,优点是代码简洁,缺点是自定义序列有字符长度限制(255个). 第2种方法是字 ...