JBOSS 點滴

          豐豐的博客

          ROW_NUMBER() OVER函數(shù)的基本用法

          ROW_NUMBER() OVER函數(shù)的基本用法

          ROW_NUMBER() OVER函數(shù)的基本用法用法

           轉(zhuǎn)自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html

          語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

          簡單的說row_number()從1開始,為每一條分組記錄返回一個數(shù)字,這里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降序以后的沒條xlh記錄返回一個序號。
          示例:
          xlh           row_num
          1700              1
          1500              2
          1085              3
          710                4

          row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根據(jù)COL1分組,在分組內(nèi)部根據(jù) COL2排序,而此函數(shù)計算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)

          實例:

          初始化數(shù)據(jù)

          create table employee (empid int ,deptid int ,salary decimal(10,2))
          insert into employee values(1,10,5500.00)
          insert into employee values(2,10,4500.00)
          insert into employee values(3,20,1900.00)
          insert into employee values(4,20,4800.00)
          insert into employee values(5,40,6500.00)
          insert into employee values(6,40,14500.00)
          insert into employee values(7,40,44500.00)
          insert into employee values(8,50,6500.00)
          insert into employee values(9,50,7500.00)

          數(shù)據(jù)顯示為

          empid       deptid      salary
          ----------- ----------- ---------------------------------------
          1           10          5500.00
          2           10          4500.00
          3           20          1900.00
          4           20          4800.00
          5           40          6500.00
          6           40          14500.00
          7           40          44500.00
          8           50          6500.00
          9           50          7500.00

          需求:根據(jù)部門分組,顯示每個部門的工資等級

          預(yù)期結(jié)果:

          empid       deptid      salary                                  rank
          ----------- ----------- --------------------------------------- --------------------
          1           10          5500.00                                 1
          2           10          4500.00                                 2
          4           20          4800.00                                 1
          3           20          1900.00                                 2
          7           40          44500.00                               1
          6           40          14500.00                               2
          5           40          6500.00                                 3
          9           50          7500.00                                 1
          8           50          6500.00                                 2

          SQL腳本:

          SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

           

          轉(zhuǎn)自:http://www.cnblogs.com/digjim/archive/2006/09/20/509344.html

          我們知道,SQL Server 2005和SQL Server 2000 相比較,SQL Server 2005有很多新特性。這篇文章我們要討論其中的一個新函數(shù)Row_Number()。數(shù)據(jù)庫管理員和開發(fā)者已經(jīng)期待這個函數(shù)很久了,現(xiàn)在終于等到了!


           通常,開發(fā)者和管理員在一個查詢里,用臨時表和列相關(guān)的子查詢來計算產(chǎn)生行號。現(xiàn)在SQL Server 2005提供了一個函數(shù),代替所有多余的代碼來產(chǎn)生行號。

           我們假設(shè)有一個資料庫[EMPLOYEETEST],資料庫中有一個表[EMPLOYEE],你可以用下面的腳本來產(chǎn)生資料庫,表和對應(yīng)的數(shù)據(jù)。

           USE [MASTER]
          GO

          IF  EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'EMPLOYEE TEST')
          DROP DATABASE [EMPLOYEE TEST]
          GO
          CREATE DATABASE [EMPLOYEE TEST]
          GO
          USE [EMPLOYEE TEST]
          GO

          IF  EXISTS SELECT * FROM SYS.OBJECTS HERE OBJECT_ID = OBJECT_ID(N'[DBO].[EMPLOYEE]') AND TYPE IN (N'U'))
          DROP TABLE [DBO].[EMPLOYEE]
          GO

          CREATE TABLE EMPLOYEE (EMPID INT, FNAME VARCHAR(50),LNAME VARCHAR(50))
          GO
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021115, 'JIM', 'KENNEDY')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2121000, 'JAMES', 'SMITH')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2011111, 'ADAM', 'ACKERMAN')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (3015670, 'MARTHA', 'LEDERER')
          INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (1021710, 'MARIAH', 'MANDEZ')
          GO

           我們可以用下面的腳本查詢EMPLOYEE表。

           SELECT EMPID, RNAME, LNAME FROM EMPLOYEE

           這個查詢的結(jié)果應(yīng)該如圖1.0 

          2021110

          MICHAEL

          POLAND

          2021110

          MICHAEL

          POLAND

          2021115

          JIM

          KENNEDY

          2121000

          JAMES

          SMITH

          2011111

          ADAM

          ACKERMAN

          3015670

          MARTHA

          LEDERER

          1021710

          MARIAH

          MANDEZ


          圖1.0

           在SQL Server 2005,要根據(jù)這個表中的數(shù)據(jù)產(chǎn)生行號,我通常使用下面的查詢。 

          SELECT ROWID=IDENTITY(int,1,1) , EMPID, FNAME, LNAME INTO EMPLOYEE2 FROM EMPLOYEE ORDER BY EMPID

           這個查詢創(chuàng)建了一個新的表,用identify函數(shù)來產(chǎn)生行號。我們用下面的查詢來看看這個表的數(shù)據(jù)。 

          SELECT ROWID, EMPID, FNAME, LNAME FROM EMPLOYEE2

           上面的查詢結(jié)果如圖1.1 

          1

          1021710

          MARIAH

          MANDEZ

          2

          2011111

          ADAM

          ACKERMAN

          3

          2021110

          MICHAEL

          POLAND

          4

          2021110

          MICHAEL

          POLAND

          5

          2021115

          JIM

          KENNEDY

          6

          2121000

          JAMES

          SMITH

          7

          3015670

          MARTHA

          LEDERER


          圖1.1

           這個查詢結(jié)果很明顯EMP=2021110的行是重復(fù)的數(shù)據(jù)。

           要刪除EMPID=2021110的重復(fù)數(shù)據(jù),我們必須在EMPLOYEE2表中刪除,不能直接在EMPLOYEE中刪除。

           SQL Server 2005提供了一個新的函數(shù)(Row_Number())來產(chǎn)生行號。我們可以使用這個新函數(shù)來刪除原來表中的重復(fù)數(shù)據(jù),只用通常的表達方式再加上Row_Number()函數(shù)。

           讓我們用Row_Number()函數(shù)根據(jù)EMPID來產(chǎn)生ROWID。

           SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE

           上面的查詢結(jié)果如圖1.2 

          1

          1021710

          MARIAH

          MANDEZ

          2

          2011111

          ADAM

          ACKERMAN

          3

          2021110

          MICHAEL

          POLAND

          4

          2021110

          MICHAEL

          POLAND

          5

          2021115

          JIM

          KENNEDY

          6

          2121000

          JAMES

          SMITH

          7

          3015670

          MARTHA

          LEDERER


          圖1.2

           在這個結(jié)果中,我們可以區(qū)別EMPID是2021110的重復(fù)數(shù)據(jù)。

           我們可以用通用表查詢表達式和Row_Numner()函數(shù)來選出重復(fù)的那行數(shù)據(jù)。

           WITH [EMPLOYEE ORDERED BY ROWID] AS
          (SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
          SELECT * FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

          上面的查詢結(jié)果如圖1.3 

          4

          2021110

          MICHAEL

          POLAND


          圖1.3

           這一行重復(fù)的數(shù)據(jù)可以用下面這個通用表和Row_Number()函數(shù)來刪除。

           WITH [EMPLOYEE ORDERED BY ROWID] AS
          (SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
          DELETE FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

           刪除以后,我們可以用下面的查詢語句看一下結(jié)果。

           SELECT * FROM EMPLOYEE

           這個查詢結(jié)果如圖1.4 

          2021110

          MICHAEL

          POLAND

          2021115

          JIM

          KENNEDY

          2121000

          JAMES

          SMITH

          2011111

          ADAM

          ACKERMAN

          3015670

          MARTHA

          LEDERER

          1021710

          MARIAH

          MANDEZ


          圖 1.4

           這里我們可以看到,重復(fù)的數(shù)據(jù)已經(jīng)被刪除了。

           總結(jié)

          在這篇文章中,我們討論了SQL Server 2005 的新特性Row_Number()函數(shù),還有通常的表表達式,然后如何使用這兩個來刪除重復(fù)的行。

          posted on 2014-01-08 11:21 半導(dǎo)體 閱讀(160) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 涿鹿县| 广汉市| 太谷县| 维西| 宜阳县| 锡林浩特市| 舟曲县| 柏乡县| 揭阳市| 阿拉尔市| 班玛县| 特克斯县| 贵阳市| 高台县| 宝应县| 田林县| 雅安市| 开原市| 梨树县| 阳原县| 鹤岗市| 遂宁市| 赤壁市| 谷城县| 阜宁县| 清水河县| 长治县| 临桂县| 铅山县| 迭部县| 辽源市| 海南省| 新巴尔虎右旗| 安泽县| 于都县| 德格县| 永登县| 沁源县| 朝阳县| 巴里| 枝江市|