OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
其中,PARTITION BY 用来对子句进行分组,而order by则是对子句进行排序使用。
OVER()指定了分组的行,不使用group by就可以达到对数据分组的目的,还可以返回基础列与聚合列。
OVER窗口函数必须与聚合函数或者排序函数一起使用。聚合函数比如SUM, MAX, MIN, AVG,COUNT等,而排序函数有RANK, ROW_NUMBER,NTILE等。
回到上面的需求,我们可以有如下解法
SELECT op_name, state, state_count, state_count / sum(state_count) over(PARTITION BY op_name) as ratio from
(SELECT op_name, state, count(*) as state_count from xxx
group by op_name, state)a
order by op_name desc
limit 20;
上面用一个子查询就解决了前面的问题。子查询对op_name, state进行了联合分组,然后窗口函数中对op_name进行分组并对state_count进行求和操作,就得到了op_name的总数,即计算占比的分母。
最后的结果,与前面的join结果一样。
n1 s1 5738 0.94468225
n1 s2 308 0.05070794
n1 s3 28 0.00460981
n2 s1 208 0.28108108
n2 s2 170 0.22972973
n2 s3 362 0.48918919
在日常的工作项目中,会需要获取
占比的
计算。
我们往往会选择嵌套再一次查询去
计算占比值,但是如果我们需要配置起来,实现通用性,对于我们项目加大了难度。
为此,我考虑不以嵌套的形式,一条
sql直接输出我们想要的
占比,只需改变字段名称,就可直接获取
占比值,一并返回。
--只针对my
sql8.0以上版本,其余数据库正常使用
select id ,
count(1) as count,
concat(round(cast(count(1) /
可以用下面的SQL语句来统计一列特定值的百分比:
SELECT 列名, ROUND(COUNT() * 100.0 / SUM(COUNT()) OVER (), 2) AS 百分比
FROM 表名
GROUP BY 列名;
DROP FUNCTION IF EXISTS calculateWorkingTime;
set @workStartTime='09:30:00';
set @workEndTime='18:30:00';
— 创建函数
CREATE FUNCTION calculateWorkingTime(startDate datetime,endDate datetime)
RETURNS decimal(32,4)
BEGIN
DECLARE intnum int(255) DEFAULT 0;