ROW_NUMBER,NTILE,RANK,DENSE_RANK ,从而大大简化了编程 方式,并提供了系统性能。
-- 创建相关测试表
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',200);
INSERT INTO Sales VALUES('D','Y',200);
INSERT INTO Sales VALUES('E',250);
INSERT INTO Sales VALUES('F',300);
INSERT INTO Sales VALUES('G',100);
INSERT INTO Sales VALUES('H',150);
INSERT INTO Sales VALUES('I',250);
INSERT INTO Sales VALUES('J',100);
INSERT INTO Sales VALUES('K',250);
--ROW_NUMBER 函数
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,
(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,
(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,EmpID
SELECT EmpID,
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
--NTILE 函数
SELECT EmpID,
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 是完全一致的,在此不多做叙述
详情参见以下链接:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。