SQL查询中的聚合函数对一个或多个值执行计算,并返回单个值。
- Count计算行数。
- Sum从给定的列中添加所有值。
- Min和Max返回指定列的最低和最高值。
- AVG计算给定列中所有值的平均值。
在所有示例中,我们将使用下表。
Articles
Title | Views
3 Ways of Invoking a Method | 123
3 Iterables Converted Into Arrays | 88
How to Find Elements in Array | 402
How to Position a Div | 103
以下是文章对象的相应数组。
const articles = [
{title: '3 Ways of Invoking a Method', views: 123},
{title: '3 Iterables Converted Into Arrays', views: 88},
{title: 'How to Find Elements in Large Arrays', views: 402},
{title: 'How to Position a Div Element', views: 103}
]
RELAD方法使用还原函数将所有值从数组汇总为单个值,它在数组的每个元素上执行给定的还原函数。
我们可以编写不同的还原函数,并计算与SQL查询中的聚合函数相同的聚合物。
Count
下一个SQL查询计算文章表中的行数。
SELECT COUNT(*)
FROM Articles
为了在数组中获取对象的数量,我们可以简单地访问长度属性。
articles.length
尽管如此,我们可以编写一个不计算数组中未定义值的还原器。如果当前元素不是无效的,则计算值在每个步骤中会增加。
function count(total, article){
return (article != null && article !== undefined) ? total + 1 : total;
}
总聚合值用0初始化。请注意,第二个参数传递给了Reduce方法。
const noOfArticles= articles.reduce(count, 0);
Sum
下一个SQL查询从表中的所有文章中检索了视图总数。
SELECT SUM(Views)
FROM Articles
我们可以使用以下还原函数从一系列对象计算总视图。它采用到目前为止计算的观点总数和当前文章,它从文章中提取视图数量,并将其广告为总数。
function sum(total, article){
const {views} = article;
return total + views;
}
进行此计算时,我们从0开始作为视图总数。
const total = articles.reduce(sum, 0);
先前的解决方案很好,它可以执行所需的计算,但太具体了。让我们尝试编写一个更通用的功能,该功能以用于计算总和的属性名称。
function sum(propName){}
事实是,Reduce方法使用两个参数调用还原函数。第一个是到目前为止计算的汇总值,第二个参数是当前元素。Reduce方法不会发送我们要接受的属性名称。
解决方案是使Sum函数获取所需的属性名称,然后,返回Reduce方法所需的还原功能。
这是一个例子。
function sum(propName){
return function(total, obj){
const {[propName]: value} = obj;
return total + value;
}
}
请注意,我们如何使用破坏分配语法将对象从对象中动态提取为称为值的新变量。
const {[propName]: value} = obj;
在下面的总和函数下方创建了Reduce方法使用的还原函数。
const total = articles.reduce(sum('views'), 0);
将另一个函数作为输入或返回函数的功能是高阶函数,Sum是一个高阶函数。
Min
下一个SQL查询使用最小聚合函数来显示文章中的最小视图数量。
SELECT MIN(Views)
FROM Articles
//88
使用还原器可以实现相同的结果,该还原器迄今为止计算出的最小视图数量和当前文章对象。当当前文章的视图少于到目前为止计算的当前最小值时,当前的视图数将成为新的最小值。
function min(propName){
return function(minimum, obj){
const {[propName]: value} = obj;
return value < minimum ? value : minimum;
}
}
我们需要回答另一个问题,计算总和0是初始值。计算最小值时的初始值是多少?
一个不错的选择是将第一篇文章中的视图数量用作最初的最小值。
const minum = articles.reduce(min('views'), articles[0].views);
Max
下面的SQL查询应用最大聚合函数以找到最大视图数。
SELECT MAX(Views)
FROM Articles
最大函数以属性名称检查并返回还原功能,还原器到目前为止获得了计算的最大值和当前对象。当当前对象的视图大于迄今为止计算的值大的视图时,当前视图数量变为新的最大值。否则,返回已经计算的最大值。
function max(propName){
return function(maximum, obj){
const {[propName]: value} = obj;
return value > maximum ? value : maximum;
}
}
调用减少方法时,我们可以从0开始作为初始视图数量。
const total = articles.reduce(max('views'), 0);
console.log(total);
Avg
下面的查询使用AVG函数计算所有文章的平均视图数量。
SELECT AVG(Views)
FROM Articles
平均值基本上是通过数字或文章潜入所有视图总和的结果,我们可以使用先前的Sum 还原器来计算视图总数,然后通过数组中的元素数进行潜水。
const total= articles.reduce(sum('views'), 0);
const averageViews = total / articles.length;
写在最后
SQL查询中的聚合函数允许将几行的值汇总到计算值中。
Reduce数组方法允许将数组中的所有元素汇总到单个值中。
我们可以实现 reducer 函数,并计算与SQL查询中的汇总函数相同的聚合物。