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

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

SqlServer 2005的排名函數使用小結

2020-10-30 19:10:37
字體:
來源:轉載
供稿:網友
盡管從技術上講,其它排名函數的計算與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
亚洲第一网站免费视频| www.99久久热国产日韩欧美.com| 国产成人精品午夜| 亚洲视屏在线播放| 亚洲美女精品久久| 国产精品国产三级国产专播精品人| 欧美网站在线观看| 成人做爰www免费看视频网站| 成人黄色av网站| 色综合伊人色综合网站| 欧美网站在线观看| 亚洲一区二区中文| 国产一区二区三区视频| 欧美成人三级视频网站| 中文字幕亚洲综合久久筱田步美| 欧美激情2020午夜免费观看| 精品久久久久久中文字幕大豆网| 欧美一区深夜视频| 黄网动漫久久久| 亚洲永久在线观看| 国产日本欧美一区| 欧美最猛黑人xxxx黑人猛叫黄| 欧美另类99xxxxx| 亚洲欧美日韩久久久久久| 日韩av网站在线| 亚洲天堂av高清| 日韩美女激情视频| 久久久免费在线观看| 91免费欧美精品| 精品免费在线视频| 日韩有码在线电影| 久久高清视频免费| 日韩精品在线播放| 色青青草原桃花久久综合| 亚洲精品第一国产综合精品| 国产亚洲欧美另类中文| 欧美性xxxx在线播放| 午夜精品福利电影| 日本中文字幕成人| 狠狠综合久久av一区二区小说| 国产精品扒开腿爽爽爽视频| 欧美中文字幕在线播放| 国产精品劲爆视频| 欧美乱妇高清无乱码| 日韩中文字幕欧美| 欧美影院在线播放| 国产欧美日韩精品在线观看| 成人免费观看网址| 成人精品一区二区三区电影黑人| 亚洲精品国产综合久久| 久久国产视频网站| 国外成人性视频| 国产丝袜一区视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 97久久精品人人澡人人爽缅北| 欧美大片在线看免费观看| 91久久精品一区| 91精品视频一区| 亚洲人成电影在线观看天堂色| 日韩在线播放av| 日韩av在线网站| 爽爽爽爽爽爽爽成人免费观看| 亚洲男人天堂网| 色阁综合伊人av| 成人在线免费观看视视频| 国产欧美婷婷中文| 欧美麻豆久久久久久中文| 国产精品久久av| 欧美有码在线观看视频| 精品亚洲一区二区三区在线观看| 少妇高潮久久77777| 亚洲成人久久久久| 在线视频欧美日韩精品| 97福利一区二区| 九九精品在线播放| 国产精品成人免费电影| 高清欧美电影在线| 国产成人在线亚洲欧美| 最新中文字幕亚洲| 国产精品视频公开费视频| 亚洲一区二区黄| 91精品国产高清| 亚洲视频视频在线| 欧美性高潮床叫视频| 欧美孕妇孕交黑巨大网站| 国产亚洲视频中文字幕视频| 国内精品视频一区| 91精品国产综合久久男男| 成人写真视频福利网| 久久亚洲国产精品成人av秋霞| 欧美小视频在线观看| 亚洲视频电影图片偷拍一区| 欧美国产精品日韩| 精品国内自产拍在线观看| 欧美香蕉大胸在线视频观看| 国产精品福利小视频| 国外视频精品毛片| 上原亚衣av一区二区三区| 亚洲丁香久久久| 午夜精品理论片| 69国产精品成人在线播放| 国产日产亚洲精品| 97精品伊人久久久大香线蕉| 精品免费在线视频| 国产噜噜噜噜久久久久久久久| 国产精品电影一区| 欧美激情视频给我| 日韩精品视频免费| 成人网在线观看| 一区二区欧美久久| 亚洲新中文字幕| 在线国产精品视频| 91午夜在线播放| 久青草国产97香蕉在线视频| 97香蕉久久夜色精品国产| 国产成人激情小视频| 国产精品视频26uuu| 久久香蕉精品香蕉| 456亚洲影院| 国产成人精彩在线视频九色| 亚洲人成网站免费播放| 中文字幕欧美视频在线| 日韩高清电影好看的电视剧电影| 亚洲性无码av在线| 2019国产精品自在线拍国产不卡| 欧美日韩免费区域视频在线观看| 国产mv免费观看入口亚洲| 亚洲三级 欧美三级| 国产国语videosex另类| 97在线视频免费播放| 色视频www在线播放国产成人| 18一19gay欧美视频网站| 91久久综合亚洲鲁鲁五月天| 国产精品丝袜一区二区三区| 大胆欧美人体视频| 日韩欧美一区二区三区久久| 久久99国产综合精品女同| 精品国产欧美一区二区三区成人| 成人写真福利网| 高清一区二区三区四区五区| 久久五月天色综合| 色偷偷av一区二区三区乱| 日韩欧美在线网址| 亚洲成人在线网| 国产精品v日韩精品| 91超碰中文字幕久久精品| 日韩精品极品视频免费观看| 日韩成人在线网站| 欧美日韩成人在线播放| 在线观看精品自拍私拍| 亚洲精品电影网站| 性欧美长视频免费观看不卡| 国产精品成人aaaaa网站| 国产一区二区精品丝袜| 久久91亚洲精品中文字幕| 欧美极品美女视频网站在线观看免费| 成人国产精品日本在线| 日韩中文第一页| 欧美精品久久久久a| 欧美成人一二三| 日韩av在线电影网| 亚洲国内精品在线| 色青青草原桃花久久综合| 欧美夫妻性视频|