2015-01-30 3 views
0

열 ID와 코드로 구성된 원래 데이터 집합에서 다음 "순위"결과를 얻으려고합니다. 내가합니다 (행 사이의 "휴식"후 같은 순위 값을 점점 코드) 다음과 같은 결과를 얻을 CODE 열을 통해 RANK_DENSE 명령을 사용하여SQL 순위 그룹 변경

id code rank 
1  A  1 
2  A  1 
3  A  1 
4  B  2 
5  B  2 
6  C  3 
7  C  3 
8  C  3 
9  A  4 
10 A  4 

id code rank 
1  A  1 
2  A  1 
3  A  1 
4  B  2 
5  B  2 
6  C  3 
7  C  3 
8  C  3 
9  A  1 
10 A  1 

그것은 가능 id : 1-2-3에 의해 형성된 그룹과 id : 9-10에 의해 형성된 그룹 사이에 분리가있을 때 A 코드가 순위를 변경하는 첫 번째 (예제) 테이블에 표시된 결과를 얻기 위해 커서?

감사합니다.

+0

에서 비슷한 질문을 참조하십시오? – qxg

+0

내가 게시 한 첫 번째 "테이블"예제를 언급하고 있습니다. (더 자세한 내용을 주 게시물에 맞게 수정합니다) – user3247900

+0

@GiorgosBetsos sql 2012 – user3247900

답변

3

값의 시퀀스를 찾고 순위를 지정하려고합니다. 행 번호의 차이에 따라이 작업을 수행 할 수 있습니다.

:

select o.*, dense_rank() over (order by grp, code) 
from (select o.*, 
      (row_number() over (order by id) - 
       row_number() over (partition by code order by id) 
      ) as grp 
     from original o 
    ) o; 

원본 데이터와 동일한 순서로 할당을 원하는 경우, 그럼 당신은 id으로 주문할 수 있지만, 그 추가 윈도우 함수가 필요합니다 다음은 각 그룹에 다른 번호를 할당

select o.*, dense_rank() over (order by minid) as therank 
from (select o.*, min(id) over (partition by grp, code) as minid 
     from (select o.*, 
        (row_number() over (order by id) - 
        row_number() over (partition by code order by id) 
        ) as grp 
      from original o 
      ) o 
    ) o; 
+0

게시 된 두 번째 쿼리를 편집하여 올바른 동작을 허용 할 수 있습니까? min ... over 절에 대한 순서 추가 (minid (grp DESC, ASC ASC에 의한 순서)를 통해 o. *, min (id)를 선택 함) 주문을하지 않으면 "therank" 1 "이라고 대답 해주세요. 어떻게 생각하십니까? – user3247900

+0

@ user3247900 ... 그게'파티션 by '이어야합니다. –

1

현재 값은 현재 행이 이전 행과 같으면 뺍니다. SQL Server의 작품은 2012 년

WITH CTE AS (
    SELECT id, code, 
     CASE Code WHEN LAG(CODE) OVER (ORDER BY id) THEN 0 ELSE 1 END AS Diff 
    FROM Table1) 
SELECT id, code, SUM(Diff) OVER (ORDER BY id) FROM CTE 

또한 첫 기수법 순위 '무엇을 의미합니까 How to make row numbering with ordering, partitioning and grouping

+0

감사합니다. – user3247900