关于SQLServer2005的学习笔记——分析函数
2010-01-15 09:59
495 查看
SQLServer2005
提供了几个有用的分析函数如
ROW_NUMBER,NTILE,RANK,DENSE_RANK
,从而大大简化了编程
方式,并提供了系统性能。
此外根据测试
MAX,MIN,***G
之类的统计函数还是可以在分析函数中应用的,不过和
Oracle
的处理有点不一样,好像无法应用
OVER
中的
ORDER BY
子句,大概是不够成熟导致的。
SQLServer2005
提供的函数也远不如
Oracle10G
来的丰富,类似
STDDEV
之类的统计分析函数仅在
MDX
中提供;不过其他一些数据分布的分析函数可以采用变通的方式予以实现。
经过测试,以下代码
可以在
SQLServer2005
和
Oracle10g
中同时运行,结果顺序有少许不一致。
--
创建相关测试表
--ROW_NUMBER
函数
--RANK
函数和
DENSE_RANK
函数
--NTILE
函数
关于这些函数的实现原理和
Oracle
是完全一致的,在此不多做叙述
详情参见以下链接:
Oracle分析函数一——
函数列表
Oracle分析函数二——
Oracle分析函数三——SUM,***G,MIN,MAX,COUNT
Oracle分析函数四——
Oracle分析函数五——
Oracle分析函数六——
Oracle分析函数七——
Oracle分析函数八——CUBE
提供了几个有用的分析函数如
ROW_NUMBER,NTILE,RANK,DENSE_RANK
,从而大大简化了编程
方式,并提供了系统性能。
此外根据测试
MAX,MIN,***G
之类的统计函数还是可以在分析函数中应用的,不过和
Oracle
的处理有点不一样,好像无法应用
OVER
中的
ORDER BY
子句,大概是不够成熟导致的。
SQLServer2005
提供的函数也远不如
Oracle10G
来的丰富,类似
STDDEV
之类的统计分析函数仅在
MDX
中提供;不过其他一些数据分布的分析函数可以采用变通的方式予以实现。
经过测试,以下代码
可以在
SQLServer2005
和
Oracle10g
中同时运行,结果顺序有少许不一致。
--
创建相关测试表
CREATE TABLE Sales ( EmpID VARCHAR(10) NOT NULL PRIMARY KEY, MgrID VARCHAR(10) NOT NULL, Qty INT NOT NULL ); INSERT INTO Sales VALUES('A','Z',300); INSERT INTO Sales VALUES('B','X',100); INSERT INTO Sales VALUES('C','X',200); INSERT INTO Sales VALUES('D','Y',200); INSERT INTO Sales VALUES('E','Z',250); INSERT INTO Sales VALUES('F','Z',300); INSERT INTO Sales VALUES('G','X',100); INSERT INTO Sales VALUES('H','Y',150); INSERT INTO Sales VALUES('I','X',250); INSERT INTO Sales VALUES('J','Z',100); INSERT INTO Sales VALUES('K','Y',250); |
函数
SELECT EmpID,MgrID,Qty, ROW_NUMBER() OVER(ORDER BY Qty) AS RowNum_BY_Qty, ROW_NUMBER() OVER(ORDER BY Qty,EmpID) AS RowNum_BY_EmpIDQty, ROW_NUMBER() OVER(PARTITION BY MgrID ORDER BY Qty,EmpID) AS RowNum_BY_MgrID_EmpIDQty FROM Sales ORDER BY Qty -- 等效语句 SELECT EmpID,Qty, (SELECT COUNT(*) FROM Sales S2 WHERE S2.Qty<S1.Qty OR (S2.Qty=S1.Qty AND S2.EmpID<=S1.EmpID)) RowNum FROM Sales S1 ORDER BY Qty,EmpID -- 等效语句 SELECT MgrID,EmpID,Qty, (SELECT COUNT(*) FROM Sales S2 WHERE S2.MgrID=S1.MgrID AND (S2.Qty<S1.Qty OR (S2.Qty=S1.Qty AND S2.EmpID<=S1.EmpID))) RowNum FROM Sales S1 ORDER BY MgrID,Qty,EmpID |
函数和
DENSE_RANK
函数
SELECT EmpID,MgrID,Qty, RANK() OVER(ORDER BY Qty) AS Rank, DENSE_RANK() OVER(ORDER BY Qty) AS Dense_Rank, RANK() OVER(PARTITION BY MgrID ORDER BY Qty) AS Rank_Partition, DENSE_RANK() OVER(PARTITION BY MgrID ORDER BY Qty) AS Dense_Rank_Partition FROM Sales ORDER BY Qty |
函数
SELECT EmpID,MgrID,Qty, NTILE(3) OVER(ORDER BY Qty) AS Ntile_BY_Qty, NTILE(3) OVER(ORDER BY Qty,EmpID) AS Ntile_BY_EmpIDQty, NTILE(3) OVER(PARTITION BY MgrID ORDER BY Qty,EmpID) AS Ntile_BY_MgrID_EmpIDQty FROM Sales ORDER BY MgrID,Qty |
Oracle
是完全一致的,在此不多做叙述
详情参见以下链接:
Oracle分析函数一——
函数列表
Oracle分析函数二——
函数用法
Oracle分析函数三——SUM,***G,MIN,MAX,COUNT
Oracle分析函数四——
函数RANK,DENSE_RANK,FIRST,LAST…
Oracle分析函数五——
统计分析函数
Oracle分析函数六——
数据分布函数及
报表
函数
Oracle分析函数七——
分析函数案例
Oracle分析函数八——CUBE
,ROLLUP
相关文章推荐
- 关于SQLServer2005的学习笔记——分析函数
- 关于SQL Server 2005的学习笔记—分析函数
- 关于SQL Server 2005的学习笔记―分析函数
- [转载]关于SQLServer2005的学习笔记——异常捕获及处理
- 关于SQLServer2005的学习笔记——子查询
- Linux netfilter 学习笔记 之六 ip层netfilter的filter表的创建及其hook函数分析
- 29.Oracle深度学习笔记——分析函数
- SIPP 代码学习笔记3- 关于函数
- 【C++】【学习笔记】【未成功实现】关于指针的函数【very difficult】
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- 学习Python数据分析随手笔记【一】numpy数组的函数简单应用
- C语言学习笔记29——函数与宏分析
- 关于SQLServer2005的学习笔记——XML的处理
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 2.关于结构体以及结构体数组作为函数入口参数的方法(学习笔记)
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 汇编学习笔记:函数调用过程中的堆栈分析
- Oracle分析函数学习笔记3