Category

마메의여행기
사진
여행
등산
정보
개발

Search

Blog Menu

    [예제로 배우는 MS-SQL] 일련번호 생성 함수 - ROW_NUMBER

    [MSSQL] ROW_NUMBER
    일련번호를 생성하는 함수입니다.
    - PARTITION BY  :  일련번호 생성의 그룹을 지정합니다. (생략가능)
    - ORDER BY        :  일련번호를 생성할 순번을 지정합니다.

    【예제】
    SELECT ROW_NUMBER() OVER(PARTITION BY GroupCode
                   ORDER BY AreaCode ASC,  DialCount DESC) AS 'Order'

    【데이타】

     GroupCode  AreaCode  DialCount 
     A  1  0
     A  1  1
     A  2  1
     A  3  2
     B  1  0
     B  1  1
     B  2  1
     B  3  1
     B  1  1

    【실행】
    SELECT ROW_NUMBER() OVER(PARTITION BY GroupCode
                   ORDER BY AreaCode ASC,  DialCount DESC) AS 'Order'
    , GroupCode
    , AreaCode
    , DialCount
    위와 같이 실행하면 처리는
    ①   AreaCode ASC,  DialCount DESC 기준으로 정렬한다.
    ② 일련번호가 각 GroupCode단위로 가산된다. 

    【결과】  
     Order  GroupCode  AreaCode  DialCount 
     2  A  1 0
     1  A  1 1
     3  A  2
     4  A  3
     3  B  1
     2  B  1
     4  B  2
     5  B  3
     1  B  1 3
    ※ ROW_NUMBER의 ORDER BY는 일련번호를 구할때만 사용되므로
        결과자체를 정렬하고 싶을때는 별도로 Order기준으로 ORDER BY해주셔야 합니다.





    【이하는 보관용 자료입니다】

    SELECT
      ROW_NUMBER() OVER(PARTITION BY A.AreaCode
                        ORDER BY A.AreaCode ASC, B.AOrder DESC, A.DialCount ASC
      ) AS 'DialOrder'
      , A.AreaCode
      , B.AOrder
      , A.DialCount
      , A.ProfileID
      , A.PhoneNo
      , 300000000 + A.NodialCategoryID
      , GETDATE()
    FROM
      TB_Tmp_CTI1 as A
      INNER JOIN (
        SELECT
          TB_Tmp_CTI1.BelongCode
          , TB_Tmp_CTI1.AreaCode
          , Count(TB_Tmp_CTI1.ProfileID) AS AOrder
        FROM
          TB_Tmp_CTI1
        WHERE
          TB_Tmp_CTI1.GroupID = 30
        GROUP BY
          TB_Tmp_CTI1.BelongCode
          , TB_Tmp_CTI1.AreaCode
      ) as B
        ON A.BelongCode = B.BelongCode
        AND A.AreaCode = B.AreaCode
    WHERE
      A.GroupID = 30
    ORDER BY
      DialOrder
      , A.NodialCategoryID ASC


    http://d.hatena.ne.jp/pink-woof/20081110/1226287028