国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

SQL Server 排名函數

2024-08-31 00:56:05
字體:
來源:轉載
供稿:網友

一、需求

  之前sql server 的排名函數用得最多的應該是ROW_NUMBER()了,我通常用ROW_NUMBER() + CTE 來實現分頁;今天逛園,看到另一個內置排名函數還不錯,自己順便想了一個需求,大家可以花1分鐘先想想要怎么實現。

  需求很簡單:求成績排名前五的學生信息。

  例如:

  

  由于成績可以并列,所以前五名可能有多個。例如:

    

  測試數據: 

DECLARE @t TABLE    (      ID INT ,      StudentName NVARCHAR(15) ,      Score INT    );INSERT INTO @t SELECT 1, '黃一', 99 UNION ALL SELECT 2, '吳二', 99 UNION ALL SELECT 3, '張三', 99 UNION ALL SELECT 4, '李四', 98 UNION ALL SELECT 5, '王五', 97 UNION ALL SELECT 6, '趙六', 96 UNION ALL SELECT 7, '田七', 95 UNION ALL SELECT 8, '紀八', 94 UNION ALL SELECT 9, '邱九', 93 UNION ALL SELECT 10, '林十', 92二、自己實現

  我的想法:既然可能出現并列,那么就用 DISTINCT 找到前五的成績。ok,代碼如下:

SELECT t1.* FROM @t t1 join (SELECT DISTINCT top 5 Score FROM @t ORDER BY Score DESC) t2 ON t1.Score = t2.Score  看起來和上面的要求的結果還是不太一樣,少了排序,當然我們可以在程序處理,這不是問題。

三、使用內置排名函數 DENSE_RANK

  其實sql server已經內置了這樣的函數可以幫助我們輕松實現,ok,直接上代碼:

WITH cte AS (	SELECT dense_rank() over( ORDER BY Score DESC) rank, * FROM @t) SELECT * FROM cte WHERE rank < 6

 四、擴展,內置排名函數RANK

  與 DENSE_RANK類似還有一個RANK函數,不過RANK函數不會順序排名,而是根據序號排。有點繞,把上面的函數改為RANK()就知道了,得到的結果如下:

  

以上就是sql server排名函數DENSE_RANK的使用方法,分享了自己的一些想法,希望對大家的學習有所啟發。

五、ntilentile函數可以對序號進行分組處理。這就相當于將查詢出來的記錄集放到指定長度的數組中,每一個數組元素存放一定數量的記錄。ntile函數為每條記 錄生成的序號就是這條記錄所有的數組元素的索引(從1開始)。也可以將每一個分配記錄的數組元素稱為“桶”。ntile函數有一個參數,用來指定桶數。下 面的SQL語句使用ntile函數對t_table表進行了裝桶處理: 

select ntile(4) over(order by field1) as bucket,* from t_table


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新丰县| 酒泉市| 获嘉县| 阜南县| 余庆县| 舒兰市| 兴仁县| 红桥区| 政和县| 筠连县| 武城县| 永嘉县| 尤溪县| 金乡县| 唐山市| 财经| 屏东市| 抚顺市| 交城县| 凉山| 永州市| 宣汉县| 开阳县| 金塔县| 波密县| 新闻| 绿春县| 福贡县| 武隆县| 翁源县| 泉州市| 宁国市| 平山县| 台北县| 麦盖提县| 罗山县| 彭州市| 昭觉县| 博乐市| 泸水县| 扶绥县|