亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SqlServer 2005的排名函數使用小結

2024-08-31 01:01:13
字體:
來源:轉載
供稿:網友
盡管從技術上講,其它排名函數的計算與ROW_NUMBER類似,但它們的的實際應用卻少很多。RANK和DENSE——RANK主要用于排名和積分。NTILE更多地用于分析。

先創建一個示例表:

復制代碼 代碼如下:


SET NOCOUNT ON
USE [tempdb]
IF OBJECT_ID('Sales')IS NOT NULL
DROP TABLE sales

CREATE TABLE Sales
(
empid VARCHAR(10) NOT NULL PRIMARY KEY,
mgrid VARCHAR(10) NOT NULL,
qty INT NOT NULL
)

INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('A','Z',300)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('B','X',100)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('C','X',200)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('D','Y',200)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('E','Z',250)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('F','Z',300)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('G','X',100)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('H','Y',150)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('I','X',250)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('J','Z',100)
INSERT INTO [Sales] (empid,[mgrid],[qty])VALUES('K','Y',200)

CREATE INDEX idx_qty_empid ON [Sales](qty,empid)
CREATE INDEX idx_mgrid_qty_empid ON sales(mgrid,qty,empid)

--
SELECT * FROM [Sales]



復制代碼 代碼如下:


--排名函數
/**/

--Sql Server 2005排名函數只能用于查詢的SELECT 和 ORDER BY 子句中。排名計算(無論你使用什么方法)的最佳索引是在分區列、排序列、覆蓋列上創建的索引。
--行號:是指按指定順序為查詢結果集中的行分配的連續整數。在后面的節中,將描述Sql Server 2005與之前版本中計算行號的工具與方法。
SELECT empid,qty,ROW_NUMBER()OVER(ORDER BY qty)AS RowNum
FROM [Sales]
ORDER BY [qty]
--確定性
SELECT empid,qty,ROW_NUMBER()OVER(ORDER BY qty)AS RowNum,ROW_NUMBER()OVER(ORDER BY qty,empid)AS RowNum2
FROM [Sales]
ORDER BY qty,empid
--分區
SELECT mgrid,empid,qty,ROW_NUMBER()OVER(PARTITION BY mgrid ORDER BY qty,empid)AS RowNum
FROM [Sales]
ORDER BY mgrid,qty
--=====之前2000版本基于集合的方法實現
--唯一排序列:給定一個唯一的分區 + 排序列組合 (如下例的唯一的分區是empid,排序列empid
SELECT empid,(SELECT COUNT(*) FROM [Sales] AS s2 WHERE s2.empid<=s1.empid)AS rowNum
FROM [Sales] s1 ORDER BY [empid]
--查看執行計劃,(順序是從上至下,從右至左看)會發現有兩個不同的運算符使用了聚集索引。第一個是完整掃描以返回所有的行(這個例子是11行);第二個運算符先為每個外部執行查找,再執行局部掃描,以完成統計。還記得嗎?影響數據處理查詢性能的主要因素通常中I/O。這種方式在小數據量時不明顯,但當數據量較大時(大于千條),由于每一條記錄都需要將全部表掃描一次,使用這種方法掃描的總行數將是1+2+3+N,對于整體上100000行的表,你一共會掃描50005000行。順便提一下,計算前N個正整數之各的公式是(N+N的平方)/2。
--看示例即了解到的.
USE [AdventureWorks]
SET STATISTICS TIME ON
SELECT salesorderid,ROW_NUMBER()OVER(ORDER BY salesorderid)AS rownum
FROM sales.[SalesOrderHeader]

SELECT salesorderid,(SELECT COUNT(*) FROM sales.[SalesOrderHeader] b WHERE b.salesorderid<=a.salesorderid)AS rownum
FROM sales.[SalesOrderHeader] a
ORDER BY [salesorderid]

/* 結果:
(31465 行受影響)

SQL Server 執行時間:
CPU 時間 = 47 毫秒,占用時間 = 674 毫秒。

(31465 行受影響)

SQL Server 執行時間:
CPU 時間 = 133094 毫秒,占用時間 = 134030 毫秒。

可想而知,新排名函數的憂化方面是很不錯的.
*/

--不唯一排序列和附加屬性:當排序列不唯一時,你可以通過引入一個附加屬性使它唯一。以下查詢按qty和empid的順序生成行號
SELECT empid,qty,(SELECT COUNT(*) FROM [Sales] s2 WHERE s2.qty<s1.qty OR ((s2.qty=s1.qty AND s2.empid<=s1.empid)))AS rowNum
FROM [Sales] s1 ORDER BY qty,empid
--以上示例qty為排序列,empid為附加列。要統計具有相同或更小排序列表值(qty+empid)的行,在子查詢中使用以下表達式
--inner_qty < outer_qty OR (inner_qty=outer_qty AND inner_empid <= outer_empid)

--沒有附加屬性的不唯一序列:當你要根據不唯一排序列分配行號,而且不使用附加屬性時,在SQL Server 2005之前的版本中用基于集合的方法解決該問題就更復雜了。通過以下代碼清單創建并填充該表。
IF OBJECT_ID('T1')IS NOT NULL
DROP TABLE T1

CREATE TABLE T1(col1 VARCHAR(5))
INSERT INTO t1(col1) VALUES('A')
INSERT INTO t1(col1) VALUES('A')
INSERT INTO t1(col1) VALUES('A')
INSERT INTO t1(col1) VALUES('B')
INSERT INTO t1(col1) VALUES('B')
INSERT INTO t1(col1) VALUES('C')
INSERT INTO t1(col1) VALUES('C')
INSERT INTO t1(col1) VALUES('C')
INSERT INTO t1(col1) VALUES('C')
INSERT INTO t1(col1) VALUES('C')
--該解決方案必須兼容SQL Server 2000,所以你不能使用ROW_NUMBER函數。而且,此方案必須是標準的。
--在這個解決方案中,將第一次使用一個非常重要的關鍵技術--用數字輔助表生成副本。以下創建Nums表并用l<=n<=1000000之內的1000000個整數填充該表。
--第一步是,通過按col對行分組來“壓縮”數據,為每個組返回重復數(該組中的行數),還要用子查詢返回基表中具有最小排序值的行數。
SELECT col1,COUNT(*) AS dups,(SELECT COUNT(*) FROM [T1]B WHERE b.col1<a.col1)AS smaller FROM [T1]A GROUP BY [col1]
--下一步是擴展行數,即,為每一行創建連續編號的副本。
SELECT col1,dups,smaller,n FROM (
SELECT col1,COUNT(*) AS dups,(SELECT COUNT(*) FROM [T1]B WHERE b.col1<a.col1)AS smaller FROM [T1]A GROUP BY [col1]) AS D, Nums
WHERE n<=[dups]
--觀察上表的結果,理解它是如何產生行號的。
--行號可以表示為,具有更小排序值的行數加上同一排序值組內的行號,即 N + smaller。下面列出最終解決方案。
SELECT n+smaller AS rowNum, col1 FROM (
SELECT col1,COUNT(*) AS dups,(SELECT COUNT(*) FROM [T1]B WHERE b.col1<a.col1)AS smaller FROM [T1]A GROUP BY [col1]) AS D, Nums
WHERE n<=[dups]
ORDER BY [rowNum]

--創建一個填充了100W行數的Nums表
GO
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;

INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END

INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO

--在生產環境中也是有用的,例可能常用到的,數據分頁.
CREATE PROC usp_GetPage @iRowCount INT ,@iPageNo INT
AS
SELECT * FROM (
SELECT ROW_NUMBER()OVER(ORDER BY productid ASC)RowNum,* FROM production.product)OrderData
WHERE RowNum BETWEEN @iRowCount*(@iPageNo-1)+1 AND @iRowCount*@iPageNo
ORDER BY [ProductID] ASC
GO

-- 使用
EXEC usp_getpage 10,20

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av毛片网| 久久免费观看视频| 国产成人亚洲综合91| 欧美激情精品久久久久久黑人| 色偷偷88888欧美精品久久久| 国产亚洲精品激情久久| 亚洲成人精品在线| 国产成人精品久久| 91高清视频免费观看| 亚洲欧美中文日韩在线v日本| 激情亚洲一区二区三区四区| 亚洲第一中文字幕在线观看| 日韩暖暖在线视频| 97免费中文视频在线观看| 久久夜色精品亚洲噜噜国产mv| 久久久噜噜噜久久中文字免| 亚洲女人天堂成人av在线| 欧美一级片在线播放| 亚洲欧美激情四射在线日| 亚洲精品一区二区在线| 国产成人精品国内自产拍免费看| 国产97在线|亚洲| 国产亚洲精品va在线观看| 成人免费观看49www在线观看| 久久男人资源视频| 国产精品免费一区二区三区都可以| 色老头一区二区三区在线观看| 国产精品久久久久aaaa九色| 欧美激情在线观看| 亚洲毛片在线观看| 国产女人精品视频| 一本大道香蕉久在线播放29| 午夜欧美大片免费观看| 91欧美精品午夜性色福利在线| 国产成人亚洲综合| 国产午夜精品一区二区三区| 欧美乱人伦中文字幕在线| 亚洲国产精品嫩草影院久久| 久久久精品一区| 国产精品久久精品| 欧美夫妻性生活xx| 国产乱肥老妇国产一区二| 红桃视频成人在线观看| 亚洲专区在线视频| 欧美一乱一性一交一视频| 成人激情视频网| 亚州av一区二区| 欧美激情手机在线视频| 精品一区二区电影| 91精品久久久久久久久久久| 日韩在线观看免费全集电视剧网站| 91九色国产视频| 日韩欧美亚洲国产一区| 亚洲视频日韩精品| 亚洲美女又黄又爽在线观看| 国内精品久久影院| 欧美精品在线视频观看| 一区二区欧美激情| 国产美女精品免费电影| 欧美日本亚洲视频| 日韩日本欧美亚洲| 亚洲黄色成人网| 欧美电影免费观看高清| 色综合久久88| 成人久久一区二区三区| 国产99视频在线观看| 日韩在线观看网站| 亚洲人成免费电影| www国产精品com| 成人午夜黄色影院| 亚洲欧美一区二区三区四区| 91国内揄拍国内精品对白| 亚洲国产古装精品网站| 欧美一区二区三区免费观看| 亚洲精品自拍视频| 性色av一区二区三区| 精品偷拍各种wc美女嘘嘘| 韩国欧美亚洲国产| 亚洲精品视频久久| 国产精品久久久久秋霞鲁丝| 日韩电影视频免费| 日韩欧美在线视频免费观看| 国产精品一区二区三区久久| 国产成人精品视| 亚洲3p在线观看| 国产午夜精品理论片a级探花| 欧美在线视频在线播放完整版免费观看| 欧美日韩国产第一页| 欧美中文在线免费| 性欧美在线看片a免费观看| 亚洲97在线观看| 日韩一区二区在线视频| 日韩高清a**址| 亚洲精品久久久久久久久久久久久| 久久影院资源站| 欧美插天视频在线播放| 国产亚洲精品美女久久久久| 欧美视频中文字幕在线| 亚洲国产成人久久综合| 亚洲性无码av在线| 成人h视频在线观看播放| 亚洲社区在线观看| 久久久电影免费观看完整版| 日韩欧美精品在线观看| 亚洲a级在线播放观看| 欧美日本精品在线| 亚洲91av视频| 中文国产成人精品久久一| 在线观看亚洲视频| 国产精品久久久久久久久男| 在线亚洲男人天堂| 米奇精品一区二区三区在线观看| wwwwwwww亚洲| 久久久综合av| 午夜欧美大片免费观看| 久久99亚洲精品| 亚洲精品国产拍免费91在线| 国产精品免费视频xxxx| 国产精品十八以下禁看| 国产精品久久久久久婷婷天堂| 国产成+人+综合+亚洲欧美丁香花| 久久这里只有精品视频首页| 久久99青青精品免费观看| 欧美成人午夜免费视在线看片| 欧美中文字幕第一页| 91香蕉嫩草神马影院在线观看| 欧美精品生活片| 久久久免费在线观看| 亚洲最大福利视频网| 国产中文字幕91| 国产精品爽黄69| 亚洲美腿欧美激情另类| 国产精品一区二区久久久| 91网站免费看| 成人久久一区二区三区| 亚洲女同精品视频| 欧美精品在线观看| 国内精品国产三级国产在线专| 国产欧美久久久久久| 久久久久久久久久久久av| 国产精品第2页| 欧美极品欧美精品欧美视频| 91av在线视频观看| 欧美日韩国产综合新一区| 国产精品永久免费观看| 成人黄色午夜影院| 日韩电影在线观看永久视频免费网站| 亚洲视频一区二区三区| 欧美日韩国产丝袜美女| 91美女片黄在线观| 成人乱人伦精品视频在线观看| 国产精品88a∨| 国产午夜精品视频| 国产不卡精品视男人的天堂| 亚洲色图校园春色| 2018日韩中文字幕| 亚洲欧美中文日韩v在线观看| 国产91在线播放九色快色| 中文字幕亚洲一区在线观看| 亚洲午夜色婷婷在线| 亚洲午夜精品久久久久久性色| 国产精品日韩在线观看| 国产精品视频精品| 欧美国产日韩xxxxx|