首页 > 数据库 >SQL 开窗函数求和计算和去重

SQL 开窗函数求和计算和去重

时间:2022-11-07 16:11:14浏览次数:58  
标签:count 二级 求和 标签 over partition 开窗 SQL dt

前几天的时候需要弄个数据表格。里面需要用计算两个字段出现次数。
所以我使用了开窗函数

点击查看代码
```sql
select  

     concat_ws('~',if("${begin_dt}"='',current_date-8,'${begin_dt}'),if("${end_dt}"='',current_date-1,'${end_dt}')) `日期范围`,
    `一级标签`,
    `二级标签`,
    count(`二级标签`) over(partition by `二级标签`) `数量1`,
    `三级标签`,
    `四级标签`,
    count(`四级标签`) over(partition by `二级标签`,`三级标签`,`四级标签`) `数量2`,
    count(`四级标签`) over(partition by `二级标签`,`三级标签`,`四级标签`)/count(`二级标签`) over(partition by `二级标签`) `占比`
    from t1
     group by 1,2,3,5,6
as t2;

但是运行完之后发现数据变少,查询了资料之后发现

窗口函数只允许出现在查询的SELECT列表和ORDER BY子句中。它们不允许出现在其他地方,例如GROUP BY、HAVING和WHERE子句中。这是因为窗口函数的执行逻辑是在处理完这些子句之后。另外,窗口函数在非窗口聚集函数之后执行。这意味着可以在窗口函数的参数中包括一个聚集函数,但反过来不行。http://postgres.cn/docs/12/tutorial-window.html

将代码改进如下

点击查看代码
select  

    distinct concat_ws('~',if("${begin_dt}"='',current_date-8,'${begin_dt}'),if("${end_dt}"='',current_date-1,'${end_dt}')) `日期范围`, --添加去重关键词
    `一级标签`,
    `二级标签`,
    count(`二级标签`) over(partition by `二级标签`) `数量1`,
    `三级标签`,
    `四级标签`,
    count(`四级标签`) over(partition by `二级标签`,`三级标签`,`四级标签`) `数量2`,
    count(`四级标签`) over(partition by `二级标签`,`三级标签`,`四级标签`)/count(`二级标签`) over(partition by `二级标签`) `占比`
    from t1
    order by `二级标签` in ('售前','售后') desc, 3 asc --去除group by 字句
as t2;
    

去除去除group by 字句,并在查询字段使用distinct 去重关键词。至此SQL语句输出了预期的输出。

标签:count,二级,求和,标签,over,partition,开窗,SQL,dt
From: https://www.cnblogs.com/zhiquanchi/p/16866254.html

相关文章

  • Python pymysql批量执行目录里面的多个sql文件
    思路:循环指定目录中的每个.sql文件,读取每行内容,拼接到列表中,按每次1000行执行。备注:pymysql在8.0版本以前(不包含8.0)默认可以同时执行多条sql语句的,例如“insertintotb(1......
  • MySQL_总结_数据类型
    一数值型1整型Tinyint、smallint、mediumint、int/integer、bigint(根据所占的字节的大小越来越大1、2、3、4、8)特点①    都可以设置无符号和有符号,默认有符......
  • MySQL_约束
    常见约束含义一种限制,用于限制表中的数据为了保证表中的数据的准确和可靠性分类Notnull:非空约束用于保证该字段的值不能为空如:姓名、学号等Default:默认约束  ......
  • MySQL_数据类型_字符型
    较短文本charvarchar字符串类型最多字符数描述及存储需求char(M)MM:0~255之间的整数varchar(M)MM:0~65535之间的整数区别 写法M的含义......
  • MySQL_数据类型_日期型
    分类Date:只保存日期Time:只保存时间Year:只保存年 Datetime:保存日期+时间Timestamp:保存日期+时间特点 字节范围时区等的影响datetime81000~9999不......
  • MySQL_总结_联合查询
    一、含义Union:合并联合,将多次查询结果合并成一个结果二、语法查询语句1Union【all】查询语句2Union【all】…三、意义1将一条较复杂的查询语句拆分成多条语......
  • MySQL_查询顺序
    语法:7Select查询列表1From表1别名2连接类型join表23On连接条件4Where筛选5Groupby分组列表6Having筛选8Order......
  • MySQL_数据类型_整型
    数据类型字节范围Tinyint1有符号:-128~127无符号:0~255Smallint2有符号:-32768~32767无符号:0~65535Mediumint3有符号:无符号:(不用记)Int、inte......
  • MySQL_数据类型_小数
    浮点型字节范围float4不记double8不记定点型字节范围DEC(M,D)DECIMAL(M,D)M+2最大取值范围与double相同,给定decimal的有效取值范围由M和D决......
  • MySQL_联合查询_DML_删除语句
    方式一delete语法1单表的删除⭐Deletefrom表名Where筛选条件2多表的删除【补充】92Delete表1的别名From表1别名,表2别名Where连接条件And筛选条件99D......