如何使用 OVER() 函数获取列中值的总和?

Posted

技术标签:

【中文标题】如何使用 OVER() 函数获取列中值的总和?【英文标题】:How to get sum of values in a column using OVER() function? 【发布时间】:2020-07-28 14:17:14 【问题描述】:

所以我有一个表格,其中存储了每个学生的信息、他们的出生日期和学校的开学日期。所需的输出是按年龄分组的学生百分比

Biqquery中的查询写法如下,

Select ROUND(100*(Number_of_Students/Total),2) as Percent_Students,Age FROM

(SELECT count(participantname) as Number_of_Students, 
SUM(count(participantname)) OVER() AS Total,
CAST(round(date_diff(startdate, participantdob,day) / 365.25)  AS INT64) as Age 
FROM `ParticipantEnrolment` 

group by Age
order by Age)

内部查询的输出是

Row Number_of_Students  Total   Age 
1   1                   826     12
2   259                 826     13
3   358                 826     14
4   145                 826     15
5   47                  826     16
6   16                  826     17

其中 Total = 826 是 Number_of_Students 的总和

在 WorkBench 中尝试相同的查询时 - 由于 OVER() 函数,我在内部查询中遇到语法错误。 datediff 函数更改在 mysql 中按预期工作。修改后的查询如下

SELECT count(participantname) as Number_of_Students,
SUM(count(participantname)) OVER() AS TOTAL,
ROUND(timestampdiff(DAY,participantdob,startdate)/365.25) as AGE

FROM `ParticipantEnrolment`
group by AGE
order by AGE

如果我删除 OVER() 语句,查询将正常工作。在这种情况下无法弄清楚语法问题是什么!任何帮助将不胜感激

【问题讨论】:

你运行的是哪个版本的 MySQL? 【参考方案1】:

您可能正在运行不支持窗口函数的 MySQL 5.7 或更早版本。您可以使用子查询解决此问题:

select 
    count(*) as number_of_students,
    (select count(*) from participantenrolment) as total,
    round(timestampdiff(day, participantdob, startdate) / 365.25) as age
from participantenrolment
group by age
order by age

请注意,我将count(participantname) 替换为count(*):假设participantname 不可为空,则两个表达式在功能上是等效的,而count(*) 更有效。如果 participantname 是一个可为空的列,您可以将其改回。

【讨论】:

谢谢。这行得通。非常感谢您的帮助!

以上是关于如何使用 OVER() 函数获取列中值的总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列表中值的列总数 - 匿名类型的两倍

PHP - 如何回显列中值的总和?

BigQuery:除以列中值的总和以找到比率

如何获取列中值的不同计数

oracle 中 sum 如何使用,

窗口函数:如何分区?