在SQL中,如何理解Compute

在SQL中,如何理解Compute,第1张

在SQL中可以使用COMPUTE BY子句来实现返回的结果集中有合计数据,还有有原始的详细记录。

COMPTE生成合计作为附加的汇总列出现在结果集的最后。当与BY一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。

COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句 的总聚合。

选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。 

扩展资料:

compute by 子句的规则:

(1)不能将distinct与行统计函数一起使用。

(2)compute  by 子句中出的列必须出现在选择列表中。

(3)不能在含有compute by 子句的语句中使用select into 子句,因为包括compute 子句的语句会产生不规则的行。

(4)如果使用了compute by子句,则必须使用order by 子句, 而且compute by子句中的列必须包含在order by 子句中,并且对列的前后顺序和起始项都要一致。

(5)如果compute 省略了 by ,则order by 也可以省略。

sql中提供的聚合函数,通常包括sum,count,avg,max,min,但不包括乘法;

比如有这样一个数据集:

id x

1 1

1 2

1 3

2 4

2 5

2 6

;

想实现成如下形式

id prob_x

1 6

2 120

即让第一组中123=6

第二组中456=120

用data步中first+retain可以实现,但data需要先排序;

而sql的聚合函数中也没有相乘这一函数,于是有些牛人想到通过数学转化,将乘法转为加法,而sql中可以

用sum实现加法聚合。

说来也简单,主要想法就是AB=exp(lnAB)=exp(lnA+lnB);

select id,exp(sum(log(x))) as prob_x from data_set group by id;

=============================================

但我觉得也需要补充一点东西:

首先有0的情况下,log函数的定义域为{x>0},有0出现的时候,改组最后结果肯定为0;

其次是有负数的情况,需要对绝对值进行计算,计算每组负数的个数,如果负数是偶数个,那么结果为正,

如果为奇数个,则需要在结果上添上负号。

最后可以写成这样

select id,(case when sum(case when x=0 then 1 else 0 end) >0 then 0

when mod(sum(case when x<0 then 1 else 0 end),2)=0 then exp(sum(log(x)))

else -1exp(sum(log(abs(x)))) end) as prod_x from data_set group by id;

聚集函数

和大多数其它关系数据库产品一样,PostgreSQL

支持聚集函数。一个聚集函数从多个输入行中计算出一个结果。比如,我们有在一个行集合上计算

count(数目),

sum(总和),

avg(均值),

max(最大值),

min(最小值)的函数。

比如,我们可以用下面的语句找出所有低温中的最高温度:

SELECT

max(temp_lo)

FROM

weather;

max

-----

46

(1

row)如果我们想知道该读数发生在哪个城市,可能会用:

SELECT

city

FROM

weather

WHERE

temp_lo

=

max(temp_lo);

--

错!不过这个方法不能运转,因为聚集函数

max

不能用于

WHERE

子句中。存在这个限制是因为

WHERE

子句决定哪些行可以进入聚集阶段;因此它必需在聚集函数之前计算。不过,我们可以用其它方法实现这个目的;这里我们使用子查询:

SELECT

city

FROM

weather

WHERE

temp_lo

=

(SELECT

max(temp_lo)

FROM

weather);

city

---------------

San

Francisco

(1

row)这样做是可以的,因为子查询是一次独立的计算,它独立于外层查询计算自己的聚集。

聚集同样也常用于

GROUP

BY

子句。比如,我们可以获取每个城市低温的最高值:

SELECT

city,

max(temp_lo)

FROM

weather

GROUP

BY

city;

city

|

max

---------------+-----

Hayward

|

37

San

Francisco

|

46

(2

rows)这样每个城市一个输出。每个聚集结果都是在匹配该城市的行上面计算的。我们可以用

HAVING

过滤这些分组:

SELECT

city,

max(temp_lo)

FROM

weather

GROUP

BY

city

HAVING

max(temp_lo)

<

40;

city

|

max

---------+-----

Hayward

|

37

(1

row)这样就只给出那些

temp_lo

值曾经有低于

40

度的城市。最后,如果我们只关心那些名字以"S"开头的城市,我们可以用:

SELECT

city,

max(temp_lo)

FROM

weather

WHERE

city

LIKE

'S%'

GROUP

BY

city

HAVING

max(temp_lo)

<

40;语句中的

LIKE

执行模式匹配,在节97里有解释。

理解聚集和

SQL

WHERE

HAVING

子句之间的关系非常重要。WHERE

HAVING

的基本区别如下:WHERE

在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算),而

HAVING

在分组和聚集之后选取输出行。因此,WHERE

子句不能包含聚集函数;因为试图用聚集函数判断那些行将要输入给聚集运算是没有意义的。相反,HAVING

子句总是包含聚集函数。当然,你可以写不使用聚集的

HAVING

子句,但这样做没什么好处,因为同样的条件可以更有效地用于

WHERE

阶段。

在前面的例子里,我们可以在

WHERE

里应用城市名称限制,因为它不需要聚集。这样比在

HAVING

里增加限制更加高效,因为我们避免了为那些未通过

WHERE

检查的行进行分组和聚集计算。

            var query = from t in dtAsEnumerable()

                        group t by new

                        {

                            t1 = tField<int>("id"),

                            t2 = tField<int>("post")

                        } into m

                        group m by new

                        {

                            t3 = mKeyt2

                        }

                            into n

                            select new

                            {

                                Post = nKeyt3,

                                Count = nCount()

                            };

            int weight1 = queryCount(p => pCount == 2);

weight1算法如上:

weight2实在没看懂你描述的什么意思;

//希望kutpbpb的回答能对你有所帮助!

//首先说明一下嵌套聚合函数是不支持的!

//下面的SQL查询在SQL Server 2005中可以正确返回运行结果;

//customer代表账户表,Bank代表储蓄所表;

//Cbno代表customer表中的储蓄所编号,Bno代表储蓄所编号;

//City代表储蓄所所属城市,其中bk为返回结果的临时表。

正确代码:

select

from

customer

as

C,Bank

as

B

where

CCbno=BBno

and

BCity

in

(

select

City

from

Bank

group

by

City

having

count(Bno)=(select

min(Nm)

from

(

select

City,count(Bno)

from

Bank

group

by

City

)

as

bk(Cy,Nm)

)

);

1单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如:MOD(x,y)返回x除以y的余数(x和y可以是两个整数,也可以是表中的整数列)。常用的单行函数有:

字符函数:对字符串 *** 作。

数字函数:对数字进行计算,返回一个数字。

转换函数:可以将一种数据类型转换为另外一种数据类型。

日期函数:对日期和时间进行处理。

2聚合函数:聚合函数同时可以对多行数据进行 *** 作,并返回一个结果。比如SUM(x)返回结果集中x列的总和。

Max(列), AVG(列)

任意数的阶乘:

CREATE PROCEDURE PROCEDURENAME

@INUPT INT

AS

DECLARE @RESULT INT

WHILE @INTUPT>0

BEGIN

RESULT=@INPUT(@INPUT-1)

SET @INPUT=@INPUT-1

END

SELECT RESULT=@RESULT

GO

如:exec PROCEDURENAME 9

像查询一样调用这个存储过程,就会得到你要的数的阶乘。

以上就是关于在SQL中,如何理解Compute全部的内容,包括:在SQL中,如何理解Compute、sql语句中如何将聚合函数值和另一个值相乘、sql聚合函数有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9830519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存