探討SQL Server 2005的評(píng)價(jià)函數(shù)(2)_Mssql數(shù)據(jù)庫(kù)教程
推薦:SQL SERVER中易混淆的數(shù)據(jù)類型數(shù)據(jù)類弄是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。任何一種計(jì)算機(jī)語(yǔ)言都定義了自己的數(shù)據(jù)類型。當(dāng)然,不同的程序語(yǔ)言都具有不同的特點(diǎn),所定義的數(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 |
| ... | |||
默認(rèn)情況下,這個(gè)ROW_NUMBER函數(shù)把一個(gè)增量值(逐次加1)賦給結(jié)果集中的每一個(gè)記錄。借助于可選的partition參數(shù),無(wú)論何時(shí)分區(qū)(partitioning)列值發(fā)生變化,你都可以讓ROW_NUMBER函數(shù)重新計(jì)算行數(shù)。為了說(shuō)明這個(gè)問(wèn)題,我使用如下查詢語(yǔ)法創(chuàng)建了一個(gè)視圖vwTotalAmountBilledPerOrder,它將返回每一個(gè)OrderID和該訂購(gòu)的總訂單數(shù):
| SELECT OrderID,SUM(AmountBilled) AS TotalOrderAmountFROM OrderItemsGROUP BY OrderID |
這條語(yǔ)句將返回OrderItems表中每一個(gè)唯一的訂單,還有相應(yīng)于該訂單的AmountBilled值的和。借助于這個(gè)視圖,我們可以使用ROW_NUMBER方法來(lái)按最大花錢(qián)數(shù)來(lái)評(píng)價(jià)這些訂單,如下所示:
| 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 |
這個(gè)語(yǔ)句將返回如下表所示的結(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)在這個(gè)列表中(如Bob,Tito和Bruce)。也許有時(shí),我們不是想觀看以銷售量排序的所有訂單,而更想看到每一個(gè)顧客的最高訂單量。為此,我們可以通過(guò)使用ROW_NUMBER函數(shù)中的PARTITION BY子句達(dá)到這一目的,如下所示:
| 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 |
這個(gè)語(yǔ)句將返回如下表所示的結(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é)果非常不錯(cuò);但是,你卻不能在WHERE語(yǔ)句中使用ROW_NUMBER()函數(shù)(或任何其它的評(píng)價(jià)函數(shù))。也就是說(shuō),你可能想要說(shuō),"把按價(jià)格評(píng)價(jià)第5到第8名的產(chǎn)品列出"。為此,你需要使用一個(gè)派生的表或視圖。例如,你可以把上面的查詢放到一個(gè)視圖vwPriceRankedProducts中,然后使用如下查詢返回第5到第8個(gè)排名的產(chǎn)品:
| SELECT ProductID,Name,Price,PriceRankFROM vwPriceRankedProductsWHERE PriceRank BETWEEN 5 AND 8 |
四、 使用RANK和DENSE_RANK處理同級(jí)問(wèn)題
基于可選的partition子句和要求的order by子句,ROW_NUMBER函數(shù)默認(rèn)地遞增(加1)每一個(gè)返回結(jié)果的值。然而,有時(shí)你可能想以不同方式處理相同級(jí)別,而不是把相同的值賦給相同的級(jí)別。例如,前面顯示的總訂單列表中,Tito在2005年12月22日實(shí)現(xiàn)的訂單數(shù)與Bruce在2006年1月5日實(shí)現(xiàn)的訂單數(shù)相同;然而,ROW_NUMBER函數(shù)卻把這兩行評(píng)價(jià)為#4和#5,而不是都評(píng)價(jià)為#4。
分享:SQL Server 中易混淆的數(shù)據(jù)類型近來(lái)在做數(shù)據(jù)庫(kù)設(shè)計(jì),有時(shí)候真弄不清SQL2000里的數(shù)據(jù)類型,所以摘了這篇文章。 摘自“藍(lán)色理想”。 (1)char、varchar、text和nchar、nvarchar、ntext char和varchar的長(zhǎng)
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 兩條經(jīng)典SQL語(yǔ)句
- 解決SQL Server數(shù)據(jù)庫(kù)占用過(guò)多內(nèi)存的方法
- SQL Server 2005數(shù)據(jù)加密技術(shù)應(yīng)用研究
- 逐行掃描 為你講解幾個(gè)基本SQLPLUS命令
- 講解數(shù)據(jù)庫(kù)調(diào)優(yōu)與程序員相關(guān)的幾個(gè)方面
- 如何在應(yīng)用環(huán)境中構(gòu)造最優(yōu)的數(shù)據(jù)庫(kù)模式
- 解讀sql中獲得部分時(shí)間的方法
- 解讀數(shù)據(jù)庫(kù)的一些常識(shí)
- SQLServer2005重建索引前后對(duì)比分析
- 談SQL Server數(shù)據(jù)庫(kù)管理常用的SQL和T-SQL語(yǔ)句
猜你也喜歡看這些
- Mysql的主從數(shù)據(jù)庫(kù)沒(méi)有同步的解決辦法
- Mysql DNS反向解析導(dǎo)致連接超時(shí)過(guò)程分析(skip-name-resolve)
- mysql登錄遇到ERROR 1045問(wèn)題解決方法
- 解析MySQL中INSERT INTO SELECT的使用
- MySQL的重裝問(wèn)題解決方法
- MySql中把一個(gè)表的數(shù)據(jù)插入到另一個(gè)表中的實(shí)現(xiàn)代碼
- MySQL自增列插入0值的解決方案
- Java連接MySql的詳細(xì)介紹
- MySQL筆記之系統(tǒng)信息函數(shù)詳解
- 網(wǎng)站模板:如何捕獲和記錄SQL Server中發(fā)生的死鎖
- 相關(guān)鏈接:
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-探討SQL Server 2005的評(píng)價(jià)函數(shù)(2)
。