排序的函数sql
❶ sql lag() over()函数用法什么用
lag表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL ;lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
sql over的作用及用法
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。
❷ sql中order by和group by的区别
1、意思不一样。
order by 是指从英文里理解就是行的排序方式,默认的为升序。后面必须列出排序的字段名,可以是多个字段名。
group by 是指从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
2、适用范围不同:order by 用于排序,一般与asc升序或desc降序一起使用。例如select * from 表A order by 列a。
group by 用于分类汇总,一般与聚合函数(比如avg平均、sum合计、max最大、min最小、count计算行)一起使用。例如select 月份,sum(工资)as 总工资 from 工资表 group by 月份。
3、定义不同:order by主要侧重许多数据的排序,例如按照大小顺序对数据进行排列,group by主要侧重许多数据的分组,例如按照性别、年龄、国家、学科等进行分组。
4、使用的函数不一样。
order by子句中的列必须包含在聚合函数或 GROUP BY 子句中。
group by 子句中可使用的函数AVG() 、MIN() 、 MAX() 、SUM() 、COUNT() 。
5、order by从英文里理解就是行的排序方式,默认的为升序。order by后面必须列出排序的字段名,可以是多个字段名。
group by从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
(2)排序的函数sql扩展阅读
Microsoft Jet数据库引擎SQL 数据类型 由13个基本数据类型组成,它们是由 Microsoft Jet 数据库引擎和几个验证过的有效同义字定义的。常见的有:整形,单精度,双精度,可变长度字符,固定长度字符,长型,日期等等。
可以用ALTER TABLE 语句修正基数和增量。刚插进表中的行会有自动为基于新种值和增量值的列生成的值。如果新种和增长的值和以前的种值及增量匹配,就会造成复制。如果这个列是主键,复制值生成时可能导致错误。
定义成TEXT也称作MEMO)或CHAR(也称作有具体长度的 TEXT(n))的字段中的字符被储存在 Unicode 表示格式。
Unicode字符一律需要两个字节存储每一字符。对于现有的主要包含字符数据的 Microsoft Jet数据库,这可能意味着数据库文件被转换成 Microsoft Jet 4.0格式时字长会增加将近一倍。
然而,从前由单字节字符群(SBCS)指示的众多字符群的Unicode 表示可以很容易地被压缩成一个单字节。有关的详细信息,参见CREATE TABLE。如果用COMPRESSION属性定义CHAR列,数据存储时会自动被压缩,提取时解压缩。
❸ sql的order by可以自定义排序函数吗
可以的。order by 后面跟着的字段名,而且现在的瓶颈基本是在sql上,所以尽量不要在sql里执行计算函数之类。因为运算和执行函数会消耗资源,使得sql执行变慢。函数之类的能在程序里执行尽量在程序里执行,现在cpu的瓶颈还很远。
❹ SQL写一个给数字排序的函数,比如输入12,56,32要输出12,32,56. 入参不确定 可以是任意多个数
use master
go
if object_id('OrderStr')<>0 drop function OrderStr
go
create function OrderStr(@oristr varchar(256), @delimiter char,@Num int)
returns varchar(256)
as
BEGIN
DECLARE @re varchar(256) --返回值
DECLARE @ch varchar(250) --一次扫描所存放最小的字符
declare @str varchar(255)
DECLARE @j int,@k int --游标
declare @m int
set @j=0
set @re=''
--对于不含,的字符串不排序直接返回
if charindex(@delimiter,@oristr,1)=0
begin
set @re=@oristr
return @re
end
while len(@oristr)>0 --外层循环
BEGIN
set @m=charindex(@delimiter,@oristr,1)
if(@m=0 and @re is not null)
begin
set @re=isnull(@re ,'')+@delimiter+ @oristr --把ch追加给re
return @re
end
SET @ch=SUBSTRING(@oristr,1,@m-1)
set @j=1
while(@j<=len(@oristr) and charindex(@delimiter,@oristr,@j)>0) --内层循环
BEGIN
set @m=charindex(@delimiter,@oristr,@j)
if @m>0
begin
set @str=SUBSTRING(@oristr,@m+1,(case when charindex(@delimiter,@oristr,@m+1)>0 then charindex(@delimiter,@oristr,@m+1)-@m-1 else len(@oristr) end))
set @j=@m+1
end
else
begin
set @str=substring(@oristr,@j,len(@oristr))
set @j=len(@oristr)
end
if @Num = 0
if convert(int ,@str)< convert(int ,@ch)--如果OriStr[j]值比ch小,则把OriStr[j]赋值给ch
SET @ch=@str
else
SET @str=@ch
else
if @str<@ch
SET @ch=@str
else
SET @str=@ch
set @k=charindex(@ch,@oristr)
END
if @re=''
begin
set @re=@ch --把ch追加给re
end
else
begin
set @re=isnull(@re ,'')+@delimiter+ @ch --把ch追加给re
end
if (@k>0 )
begin
set @oristr=stuff(@oristr,charindex(@ch,@oristr),(case when charindex(@delimiter,@oristr,@k)>0 then charindex(@delimiter,@oristr,@k)+1-@k else len(@oristr)+1-@k end),'')
end
else
begin
set @re=isnull(@re,'') + left(@oristr,len(@oristr)-1)
set @oristr=''
end
if right(rtrim(@oristr),1)=@delimiter
begin
set @oristr=stuff(@oristr,len(@oristr),1,'')
end
END
return @re
end
go
select dbo.OrderStr('g,b,e,d,a,s',',',1)
select dbo.OrderStr('11,32,123,244,34',',',0)
既解决了数字的又解决了字符串的排序
❺ sql里的ROW_NUMBER() OVER是啥意思
ROW_NUMBER() OVER是oracle数据库的分析函数,会在数据表生成一个排序列。
语法:ROW_NUMBER ( ) OVER( [ PARTITION BY value_expression , ... [ n ] ]order_by_clause )
参数:PARTITION BYvalue_expression 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。value_expression 指定对结果集进行分区所依据的列。如果未指定 PARTITION BY,则此函数将查询结果集的 所有行视为单个组。
order_by_clause ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
(5)排序的函数sql扩展阅读
分析函数与聚合函数计算方式一样,分析函数也是对行集组进行聚合计算,但是它不像普通聚合仗函数那样每组只返回一个值,分析函数可以为每组返回多个值。
分析函数的语法为:over(partition by排 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。
ROW_NUMBER、DENSE_RANK、RANK属于排名函数。
排名分析函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
PARTITION BY用于将结果集进行分组。
ORDER BY 指定排名分析函数的顺序,在排名分析函数中必须使用ORDER BY语句。
ROW_NUMBER 为每一组的行按顺序生成一个连续序号。
RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。
❻ SQL杩涜屾帓搴忋佸垎缁勚佺粺璁$殑10涓鏂版妧宸
浠ヤ竴绉嶆湁镒忎箟镄勬柟寮忕粍缁囨暟鎹鍙鑳芥槸涓椤规写鎴樸傛湁镞朵綘闇瑕佺殑鍙鑳芥槸涓涓绠鍗旷殑鎺掑簭锛屼絾鏄阃氩父浣犻渶瑕佸仛镟村氾纴浣犻渶瑕佸垎缁勬潵杩涜屽垎鏋愬拰缁熻°傚垢杩愮殑鏄锛孲QL鎻愪緵浜嗗ぇ閲忚鍙ュ拰镎崭綔𨱒ヨ繘琛屾帓搴忥纴鍒嗙粍鍜屾憳瑕併备笅闱㈢殑涓浜涙妧宸у皢浼氩府锷╀綘璇嗗埆浠涔堟椂鍊欐帓搴忥纴浠涔堟椂鍊椤垎缁勶纴浠涔堟椂鍊欎互鍙婂备綍缁熻°傚硅佹疮𨱒¤鍙ュ拰镎崭綔镄勮︾粏淇℃伅璇锋煡鐪婤ooks Online銆
銆銆1.浣跨敤鎺掑簭浣挎暟鎹链夊簭
銆銆阃氩父锛屼綘镄勬墍链夋暟鎹鐪熸i渶瑕佺殑浠呬粎鏄鎸夋煇绉嶉‘搴忔帓鍒椼係QL镄凮RDER BY璇鍙ュ彲浠ヤ互瀛楁瘝鎴栨暟瀛楅‘搴忕粍缁囨暟鎹銆傚洜姝わ纴鐩镐技镄勫兼寜缁勬帓搴忓湪涓璧枫傜劧钥岋纴杩欎釜鍒嗙粍镞舵帓搴忕殑缁撴灉锛屽苟涓嶆槸鐪熺殑鍒嗙粍銆侽RDER BY鏄剧ず姣忔浔璁板綍钥屽垎缁勫彲鑳戒唬琛ㄥ緢澶氲板綍銆
銆銆2.杩涜屽垎缁勯櫎铡婚吨澶嶅
銆銆鎺掑簭鍜屽垎缁勪箣闂寸殑鍖哄埆鏄锛氭帓搴忕殑鏁版嵁鏄剧ず镓链夎板綍锛埚湪闄愬畾镙囧嗳锣冨洿涔嫔唴锛夛纴钥屽垎缁勬暟鎹涓嶆槸鏄剧ず镓链夎板綍銆侴ROUP BY璇鍙ュ逛簬钖屾牱镄勫煎彧鏄剧ず涓𨱒¤板綍銆备緥濡傦纴涓嬮溃镄勮鍙ヤ腑镄凣ROUP BY璇鍙ュ规暟鎹婧愪腑閲嶅嶅嚭鐜扮殑鏁版嵁鍙杩斿洖镄剒ip缂栫爜鍒椼
銆銆SELECT ZIP FROM Customers GROUP BY ZIP
銆銆鍙鍖呮嫭鐢盙ROUP BY鍜孲ELECT璇鍙ュ叡钖屽畾涔夌殑闾d簺璁板綍锛屾崲鍙ヨ瘽璇达纴SELECT鍒楄〃蹇呴’婊¤冻GROUP BY鍒楄〃锛屼絾鏄链変竴涓渚嫔栧氨鏄疭ELECT鍒楄〃鍙浠ュ寘钖镵氩悎鍑芥暟锛圙ROUP BY璇鍙ヤ笉鍏佽镐娇鐢ㄨ仛钖埚嚱鏁帮级銆傞渶瑕佹敞镒忕殑鏄疓ROUP BY璇鍙ヤ笉浼氩圭粨鏋滃垎缁勮繘琛屾帓搴忋备负浜嗕娇鍒嗙粍鎸夊瓧姣嶆垨鏁板瓧链夊簭鎺掑垪锛岄渶瑕佹坊锷燨RDER BY璇鍙ャ傛ゅ栵纴鍦℅ROUP BY璇鍙ヤ腑涓嶈兘寮旷敤浣跨敤浜嗗埆钖岖殑瀛楁点傚垎缁勬爮鐩蹇呴’鏄娼滃湪镄勬暟鎹锛屼絾瀹冧滑骞朵笉闇瑕佹樉绀哄湪缁撴灉涓銆
銆銆3.鍦ㄥ垎缁勪箣鍓嶈繘琛屾暟鎹绛涢
銆銆浣犲彲浠ユ坊锷犱竴涓猈HERE璇鍙ユ潵绛涢夋湁GROUP BY镓寰楀垎缁勪腑镄勬暟鎹銆备緥濡傦纴涓嬮溃镄勮鍙ュ彧杩斿洖镶濉斿熀宸为【瀹㈢殑ZIP缂栫爜鍒椼
銆銆SELECT ZIP FROM CustomersWHEREState = 钬橩Y钬 GROUP BY ZIP
銆銆蹇呴’娉ㄦ剰镄勬槸WHERE璇鍙ユ槸鍦℅ROUP BY璇鍙ユ眰鍊间箣鍓嶈繘琛屾暟鎹杩囨护镄勚备笌GROUP BY璇鍙ヤ竴镙凤纴WHERE璇鍙ヤ篃涓嶆敮鎸佽仛钖埚嚱鏁般
銆銆4.杩斿洖镓链夊垎缁
銆銆褰扑綘浣跨敤WHERE璇鍙ヨ繃婊ゆ暟鎹镞讹纴缁撴灉鍒嗙粍涓鍙鏄剧ず浣犳寚瀹氱殑闾d簺璁板綍锛岃岀﹀悎鍒嗙粍瀹氢箟浣嗘槸涓嶆弧瓒宠繃婊ゆ浔浠剁殑鏁版嵁涓崭细鍖呭惈鍦ㄦ煇涓鍒嗙粍涓銆傚綋浣犳兂鍦ㄥ垎缁勪腑鍖呭惈镓链夋暟鎹镞舵坊锷犲叧阌瀛桝LL鍗冲彲锛岃繖镞禬HERE𨱒′欢灏变笉璧蜂綔鐢ㄣ备緥濡傦纴鍦ㄥ墠闱㈢殑渚嫔瓙涓娣诲姞鍏抽敭瀛桝LL灏变细杩斿洖镓链夌殑ZIP鍒嗙粍锛岃屼笉鏄浠呭湪镶濉斿熀宸炵殑闾d簺銆
銆銆SELECT ZIP FROM CustomersWHEREState = 钬橩Y钬 GROUP BY ALL ZIP
銆銆杩欐牱鐪嬫潵锛岃繖涓や釜璇鍙ュ瓨鍦ㄥ啿绐侊纴浣犲彲鑳戒笉浼氢互杩欑嶆柟寮忎娇鐢ㄥ叧阌瀛桝LL銆傚綋浣犱娇鐢ㄨ仛钖埚嚱鏁拌$畻镆愪竴鍒楁椂锛屼娇鐢ˋLL鍏抽敭瀛楀彲鑳戒细寰堟柟渚裤备緥濡傦纴涓嬮溃镄勮鍙ヨ$畻姣忎釜镶濉斿熀宸瀂IP涓镄勯【瀹㈡暟锛屽悓镞讹纴杩树细鏄剧ず鍏跺畠镄刏IP鍊笺
銆銆SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM
銆銆CustomersWHEREState = 钬橩Y钬 GROUP BY ALL ZIP
銆銆缁撴灉鍒嗙粍鍖呮嫭娼滃湪鏁版嵁涓镄勬墍链塟IP鍊硷纴铹惰岋纴瀵逛簬闾d簺涓嶆槸镶濉斿熀宸瀂IP鍒嗙粍镄勮仛钖埚垪(KYCustomersByZIP)灏嗕细鏄剧ず0銆傝繙绋嬫煡璇涓嶆敮鎸併GROUP BY ALL銆
銆銆5.鍒嗙粍钖庣瓫阃夋暟鎹
銆銆WHERE璇鍙ュ湪GROUP BY璇鍙ヤ箣鍓嶈繘琛岃$畻銆傚綋浣犻渶瑕佸湪鍒嗙粍涔嫔悗绛涢夋暟鎹镞讹纴鍙浠ヤ娇鐢℉AVING璇鍙ャ傞氩父𨱍呭喌涓嬶纴WHERE璇鍙ュ拰HAVING璇鍙ョ殑杩斿洖缁撴灉鏄涓镙风殑锛屼絾鏄鍊煎缑娉ㄦ剰镄勬槸杩欎袱涓璇鍙ヤ笉鍙浜掓崲銆傚綋浣犺糠𨱍戞椂锛屽彲浠ラ伒寰涓嬮溃镄勮存槑锛氢娇鐢╓HERE璇鍙ヨ繃婊よ板綍锛屼娇鐢℉AVING璇鍙ヨ繃婊ゅ垎缁勚
銆銆涓鑸𨱍呭喌锛屼綘浼氢娇鐢℉AVING璇鍙ュ拰镆愪釜镵氩悎鍑芥暟璁$畻涓涓鍒嗙粍銆备緥濡傦纴涓嬮溃镄勮鍙ヨ繑锲炰竴涓镄刏IP缂栫爜鍒楋纴浣嗘槸鍙鑳戒笉浼氩寘钖娼滃湪鏁版嵁婧愪腑镓链夌殑ZIP銆
銆銆SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM
銆銆Customers GROUP BY ZIP HAVING Count(ZIP) = 1
銆銆鍙链夐偅浜涘寘钖涓浣嶉【瀹㈢殑鍒嗙粍鏄剧ず鍦ㄧ粨鏋滀腑銆
銆銆6.杩涗竴姝ヤ简瑙WHERE鍜孒AVING璇鍙
銆銆濡傛灉浣犲逛綍镞跺簲璇ヤ娇鐢╓HERE锛屼綍镞朵娇鐢℉AVING浠嶆棫寰堣糠𨱍戯纴璇烽伒镦т笅闱㈢殑璇存槑锛
銆銆WHERE璇鍙ュ湪GROUP BY璇鍙ヤ箣鍓嶏绂SQL浼氩湪鍒嗙粍涔嫔墠璁$畻WHERE璇鍙ャ
銆銆HAVING璇鍙ュ湪GROUP BY璇鍙ヤ箣钖庯绂SQL浼氩湪鍒嗙粍涔嫔悗璁$畻HAVING璇鍙ャ
銆銆7.浣跨敤镵氩悎鍑芥暟缁熻″垎缁勬暟鎹
銆銆鍒嗙粍鏁版嵁鍙浠ュ府锷╂垜浠鍒嗘瀽鏁版嵁锛屼絾鏄链夋椂鎴戜滑鍙鑳介渶瑕佹洿澶氱殑淇℃伅钥屼笉浠呬粎鏄鍒嗙粍銆备綘鍙浠ヤ娇鐢ㄨ仛钖埚嚱鏁版潵缁熻″垎缁勬暟鎹銆备緥濡傦纴涓嬮溃镄勮鍙ユ樉绀烘疮镓硅㈣喘鍗旷殑镐讳环阍便
銆銆SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal 銆FROM Orders GROUP BY OrderID
銆銆瀵逛簬鍏跺畠镄勫垎缁勬潵璇达纴SELECT鍜孏ROUP銆BY鍒楀繀椤诲尮閰嶃傝孲ELECT璇鍙ュ寘钖镵氩悎鍑芥暟镞惰繖涓瑙勫垯鏄涓涓渚嫔栥
銆銆8.缁熻¤仛钖堟暟鎹
銆銆浣犲彲浠ョ户缁缁熻℃暟鎹涓烘疮涓鍒嗙粍鏄剧ず涓涓鍒嗙被缁熻°係QL镄凴OLLUP镎崭綔绗﹀彲浠ヤ负姣忎釜鍒嗙粍鏄剧ず涓涓棰濆栫殑鍒嗙被缁熻°傝繖涓鍒嗙被缁熻℃槸浣跨敤镵氩悎鍑芥暟璁$畻姣忎釜鍒嗙粍涓镄勬墍链夎板綍寰楀埌镄勭粨鏋溿备笅闱㈢殑璇鍙ヤ负姣忎釜鍒嗙粍璁$畻OrderTotal锛
銆銆SELECT Customer, OrderNumber, Sum(Cost * Quantity) 銆AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP
銆銆瀵逛簬链変袱涓鍒嗗埆涓20鍜25 OderTotal鍊肩殑鍒嗙粍锛孯OLLUP鏄剧ず涓涓狾rderTotal鍊45銆俣OLLUP缁撴灉涓镄勭涓𨱒¤板綍鏄镄勶纴锲犱负瀹冩槸璁$畻镓链夊垎缁勮板綍锛岃繖涓鍊兼槸鏁翠釜璁板綍闆嗙殑镐诲笺
銆銆ROLLUP鍦ㄨ仛钖埚嚱鏁颁腑涓嶆敮鎸 DISTINCT锛屼篃涓嶆敮鎸丢ROUP BY ALL璇鍙ャ
銆銆9.缁熻℃疮涓鍒
銆銆CUBE镎崭綔绗︽瘆ROLLUP镟磋繘涓姝ワ纴瀹冭繑锲炴疮涓鍒嗙粍涓閲嶅嶅肩殑涓鏁般傚畠镄勭粨鏋滃拰ROLLUP鐩稿悓锛屼絾鏄瀵规疮浣嶅㈡埛镄勬疮涓鍒桟UBE鍖呭惈涓涓棰濆栫殑璁板綍銆备笅闱㈢殑璇鍙ユ樉绀烘疮涓鍒嗙粍镄勭粺璁″拰棰濆栨疮浣嶅㈡埛镄勭粺璁°
銆銆SELECT Customer, OrderNumber, Sum(Cost * Quantity) 銆AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH CUBE
銆銆CUBE鍙浠ョ粰链缁煎悎镄勭粺璁°傚畠涓崭粎瀹屾垚镵氩悎鍜孯OLLUP镄勫姛鑳斤纴杩桦彲浠ヨ$畻瀹氢箟鍒嗙粍镄勫叾瀹冨垪锛屾崲鍙ヨ瘽璇达纴CUBE缁熻℃疮涓鍙鑳界殑鍒楃粍钖堛
銆銆CUBE涓嶆敮鎸丢ROUP BY ALL璇鍙ャ
銆銆10锛氩圭粺璁$粨鏋沧帓搴
銆銆褰揅UBE镄勭粨鏋滀护浜鸿糠𨱍戞椂锛埚畠缁忓父鏄杩欐牱锛夛纴鍙浠ユ坊锷犱竴涓狦ROUPING鍑芥暟锛屽备笅镓绀猴细
銆銆SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP
BY Customer, OrderNumber WITH CUBE
銆銆缁撴灉涓姣忚屽寘钖涓や釜棰濆栫殑鍊硷细
銆銆鍊1琛ㄧず宸﹁竟镄勫兼槸涓涓缁熻″硷纴鏄疪OLLUP鎴朇UBE镄勬搷浣灭︺
銆銆鍊0琛ㄧず宸﹁竟镄勫兼槸涓𨱒$敱链鍒濈殑GROUP BY璇鍙ヤ骇鐢熺殑璇︾粏璁板綍銆
❼ 问一个sql查询,如何给查询结果加上序号
SQL Server 下
SELECTROW_NUMBER()OVER(ORDERBYID)ROWNU,A1FROMTA1
解说:在这里,TA1是一个表,A1是表中的一个字段,表的另一个字段为ID本用于自增这儿用来排序。
SQL Server 中的ROW_NUMBER() 得到一个查询出的顺序,但这个函数要求给出一个查的排序方案,因为SQL Server的存储是无关顺序的。
在Oracle里,本就有rownum。可直接用:
SELECTrownum,A1FROMTA1
其它的数据库可能有别的方案,不一而论。