如何使用 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() 函数获取列中值的总和?的主要内容,如果未能解决你的问题,请参考以下文章