<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JBOSS 點滴

    豐豐的博客

    ROW_NUMBER() OVER函數的基本用法

    ROW_NUMBER() OVER函數的基本用法

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

     轉自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html

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

    簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這里的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) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)

    實例:

    初始化數據

    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)

    數據顯示為

    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

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

    預期結果:

    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

     

    轉自:http://www.cnblogs.com/digjim/archive/2006/09/20/509344.html

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


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

     我們假設有一個資料庫[EMPLOYEETEST],資料庫中有一個表[EMPLOYEE],你可以用下面的腳本來產生資料庫,表和對應的數據。

     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

     這個查詢的結果應該如圖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,要根據這個表中的數據產生行號,我通常使用下面的查詢。 

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

     這個查詢創建了一個新的表,用identify函數來產生行號。我們用下面的查詢來看看這個表的數據。 

    SELECT ROWID, EMPID, FNAME, LNAME FROM EMPLOYEE2

     上面的查詢結果如圖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

     這個查詢結果很明顯EMP=2021110的行是重復的數據。

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

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

     讓我們用Row_Number()函數根據EMPID來產生ROWID。

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

     上面的查詢結果如圖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

     在這個結果中,我們可以區別EMPID是2021110的重復數據。

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

     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

    上面的查詢結果如圖1.3 

    4

    2021110

    MICHAEL

    POLAND


    圖1.3

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

     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

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

     SELECT * FROM EMPLOYEE

     這個查詢結果如圖1.4 

    2021110

    MICHAEL

    POLAND

    2021115

    JIM

    KENNEDY

    2121000

    JAMES

    SMITH

    2011111

    ADAM

    ACKERMAN

    3015670

    MARTHA

    LEDERER

    1021710

    MARIAH

    MANDEZ


    圖 1.4

     這里我們可以看到,重復的數據已經被刪除了。

     總結

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 黄页网站在线观看免费| 亚洲高清有码中文字| 精品国产免费一区二区三区| 一本久久综合亚洲鲁鲁五月天| 亚洲av综合日韩| 亚洲色婷婷综合开心网| 一本久久A久久免费精品不卡| 亚洲成A人片在线观看无码3D | 亚洲中文字幕无码av| 日韩视频在线免费观看| 日本系列1页亚洲系列| 亚洲国产香蕉人人爽成AV片久久| 成人免费夜片在线观看| 亚洲人成影院在线无码按摩店| 久久er国产精品免费观看2| 亚洲色图在线观看| 97免费人妻无码视频| 亚洲精品无码久久久久久| 免费国产成人午夜私人影视| 国产精品免费视频观看拍拍| 亚洲电影中文字幕| 久久久久免费看黄A片APP| 亚洲AV网一区二区三区| 亚洲精品成人无码中文毛片不卡| 91香蕉在线观看免费高清| 亚洲AV日韩综合一区尤物| 亚洲国产V高清在线观看| 免费人成黄页在线观看日本| 国产成人亚洲精品| 亚洲第一黄片大全| 老汉精品免费AV在线播放| 伊人久久亚洲综合影院首页| 亚洲天堂在线视频| 69式国产真人免费视频| 免费一级全黄少妇性色生活片 | 青青操视频在线免费观看| 亚洲国产成人九九综合| 亚洲av日韩av欧v在线天堂| 免费无码一区二区三区| 亚洲JIZZJIZZ妇女| 91在线亚洲精品专区|