探討SQL Server 2005的評價函數(shù)(2)_Mssql數(shù)據(jù)庫教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:SQL SERVER中易混淆的數(shù)據(jù)類型數(shù)據(jù)類弄是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。任何一種計算機語言都定義了自己的數(shù)據(jù)類型。當然,不同的程序語言都具有不同的特點,所定義的數(shù)據(jù)類型的各類和名稱都或多或少有些不同。
| ProductID | Name | Price | PriceRank |
| 8 | Desk | 495.0000 | 1 |
| 10 | Executive Chair | 295.0000 | 2 |
| 9 | Chair | 125.0000 | 3 |
| 5 | Mouse | 14.9500 | 4 |
| 6 | Mousepad | 9.9900 | 5 |
| 11 | Scissors | 8.5000 | 6 |
| 4 | Stapler | 7.9500 | 7 |
| 3 | Binder | 1.9500 | 8 |
| ... | |||
默認情況下,這個ROW_NUMBER函數(shù)把一個增量值(逐次加1)賦給結(jié)果集中的每一個記錄。借助于可選的partition參數(shù),無論何時分區(qū)(partitioning)列值發(fā)生變化,你都可以讓ROW_NUMBER函數(shù)重新計算行數(shù)。為了說明這個問題,我使用如下查詢語法創(chuàng)建了一個視圖vwTotalAmountBilledPerOrder,它將返回每一個OrderID和該訂購的總訂單數(shù):
| SELECT OrderID,SUM(AmountBilled) AS TotalOrderAmountFROM OrderItemsGROUP BY OrderID |
這條語句將返回OrderItems表中每一個唯一的訂單,還有相應(yīng)于該訂單的AmountBilled值的和。借助于這個視圖,我們可以使用ROW_NUMBER方法來按最大花錢數(shù)來評價這些訂單,如下所示:
| SELECT c.Name,o.DateOrdered,tab.TotalOrderAmount, ROW_NUMBER() OVER (ORDER BY TotalOrderAmount DESC) AS BestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNER JOIN Customers AS c ON c.CustomerID = o.CustomerID |
這個語句將返回如下表所示的結(jié)果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer |
| Bob | 12/1/2005 | 12649.9900 | 1 |
| Darren | 1/2/2006 | 620.0000 | 2 |
| Bob | 12/19/2005 | 265.8500 | 3 |
| Tito | 12/22/2005 | 14.9500 | 4 |
| Bruce | 1/5/2006 | 14.9500 | 5 |
| Tito | 12/18/2005 | 12.4400 | 6 |
| Bruce | 1/4/2006 | 9.9900 | 7 |
| Lee Ann | 1/3/2006 | 8.5000 | 8 |
| ... | |||
注意,某些顧客多次出現(xiàn)在這個列表中(如Bob,Tito和Bruce)。也許有時,我們不是想觀看以銷售量排序的所有訂單,而更想看到每一個顧客的最高訂單量。為此,我們可以通過使用ROW_NUMBER函數(shù)中的PARTITION BY子句達到這一目的,如下所示:
| SELECT c.Name, o.DateOrdered, tab.TotalOrderAmount, ROW_NUMBER() OVER (PARTITION BY c.CustomerID ORDER BY TotalOrderAmount DESC) AS BestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNER JOIN Customers AS c ON c.CustomerID = o.CustomerID |
這個語句將返回如下表所示的結(jié)果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer |
| Bob | 12/1/2005 | 12649.9900 | 1 |
| Bob | 12/19/2005 | 265.8500 | 2 |
| Tito | 12/22/2005 | 14.9500 | 1 |
| Tito | 12/18/2005 | 12.4400 | 2 |
| Darren | 1/2/2006 | 620.0000 | 1 |
| Bruce | 1/5/2006 | 14.9500 | 1 |
| Bruce | 1/4/2006 | 9.9900 | 2 |
| Lee Ann | 1/3/2006 | 8.5000 | 1 |
| ... | |||
注意,盡管這些結(jié)果非常不錯;但是,你卻不能在WHERE語句中使用ROW_NUMBER()函數(shù)(或任何其它的評價函數(shù))。也就是說,你可能想要說,"把按價格評價第5到第8名的產(chǎn)品列出"。為此,你需要使用一個派生的表或視圖。例如,你可以把上面的查詢放到一個視圖vwPriceRankedProducts中,然后使用如下查詢返回第5到第8個排名的產(chǎn)品:
| SELECT ProductID,Name,Price,PriceRankFROM vwPriceRankedProductsWHERE PriceRank BETWEEN 5 AND 8 |
四、 使用RANK和DENSE_RANK處理同級問題
基于可選的partition子句和要求的order by子句,ROW_NUMBER函數(shù)默認地遞增(加1)每一個返回結(jié)果的值。然而,有時你可能想以不同方式處理相同級別,而不是把相同的值賦給相同的級別。例如,前面顯示的總訂單列表中,Tito在2005年12月22日實現(xiàn)的訂單數(shù)與Bruce在2006年1月5日實現(xiàn)的訂單數(shù)相同;然而,ROW_NUMBER函數(shù)卻把這兩行評價為#4和#5,而不是都評價為#4。
分享:SQL Server 中易混淆的數(shù)據(jù)類型近來在做數(shù)據(jù)庫設(shè)計,有時候真弄不清SQL2000里的數(shù)據(jù)類型,所以摘了這篇文章。 摘自“藍色理想”。 (1)char、varchar、text和nchar、nvarchar、ntext char和varchar的長
相關(guān)Mssql數(shù)據(jù)庫教程:
- sql 語句練習與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- 兩條經(jīng)典SQL語句
- 解決SQL Server數(shù)據(jù)庫占用過多內(nèi)存的方法
- SQL Server 2005數(shù)據(jù)加密技術(shù)應(yīng)用研究
- 逐行掃描 為你講解幾個基本SQLPLUS命令
- 講解數(shù)據(jù)庫調(diào)優(yōu)與程序員相關(guān)的幾個方面
- 如何在應(yīng)用環(huán)境中構(gòu)造最優(yōu)的數(shù)據(jù)庫模式
- 解讀sql中獲得部分時間的方法
- 解讀數(shù)據(jù)庫的一些常識
- SQLServer2005重建索引前后對比分析
- 談SQL Server數(shù)據(jù)庫管理常用的SQL和T-SQL語句
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-探討SQL Server 2005的評價函數(shù)(2)
。