前几天的时候需要弄个数据表格。里面需要用计算两个字段出现次数。
所以我使用了开窗函数
点击查看代码
```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