2011-09-19 4 views
-1

가 나는 TABLEA 있습니다 (아이디 INT, 배치 INT, new_batch의 int)를SQL 서버 : DENSE_RANK()

ID 및 배치가 이미 채워집니다 :

ID Batch New_Batch 
1 01 NULL 
2 01 NULL 
3 02 NULL 
4 02 NULL 
5 02 NULL 
6 03 NULL 
7 04 NULL 
8 05 NULL 

지금 내가 따라 New_batch 채우려을 다음 select 문으로 이동하십시오.

(select batch from tableA where id in (3,8)) 
  1. 이제이 select 문, 우리는 배치 = 02 및 배치 = 5를 얻을. 이제 select 문 결과가 먼저 정렬되어야하며 (batch02, batch05) new_batch를 할당하고 나머지 데이터는 select 문에서 배치 순서가 아닌 순서대로 정렬되어야합니다. (배치 1,3,4) 결과가 있어야한다 :

 ID Batch New_Batch 
     1 01 03 
     2 01 03 
     3 02 01 
     4 02 01 
     5 02 01 
     6 03 04 
     7 04 05 
     8 05 02 

감사합니다. 추 신 : DENSE_RANK()를 사용할 수 있으며 하드 코드를 사용하지 마십시오!

+0

하지 하드 코드 무엇을합니까를? 누군가가 당신에게 8 개의 진술서를 줄 것이라고 생각합니까? –

+0

아니, 제 2의 1.와 같은 케이스 배치를 사용하지 말아요. 당신이 다른 포럼 *에서 얼마나 재밌는 반응을 보일지 믿지 않을 것입니다. * –

+0

. 만약 당신이'id in (8,3)' ** 다른 ** 결과를 반환해야합니까? –

답변

2
declare @T table 
(
    ID int, 
    Batch char(2), 
    New_Batch char(2) 
) 

insert into @T values 
(1, '01', NULL), 
(2, '01', NULL), 
(3, '02', NULL), 
(4, '02', NULL), 
(5, '02', NULL), 
(6, '03', NULL), 
(7, '04', NULL), 
(8, '05', NULL) 

;with C as 
(
    select T1.New_Batch, 
     dense_rank() over(order by -T2.ID desc, T1.Batch) as rn 
    from @T as T1 
    left outer join (select Batch, ID 
        from @T 
        where ID in (3, 8)) as T2 
     on T1.Batch = T2.Batch 
) 
update C 
set New_Batch = right(100+rn, 2) 


select * 
from @T 
order by ID 

여기보십시오 : http://data.stackexchange.com/stackoverflow/q/113031/

4
/*Please provide DDL like the below for future questions*/ 
DECLARE @tableA TABLE 
(
ID INT PRIMARY KEY, 
Batch INT, 
New_Batch INT NULL 
) 

INSERT INTO @tableA(ID,Batch) 
SELECT 1,1 UNION ALL 
SELECT 2,1 UNION ALL 
SELECT 3,2 UNION ALL 
SELECT 4,2 UNION ALL 
SELECT 5,2 UNION ALL 
SELECT 6,3 UNION ALL 
SELECT 7,4 UNION ALL 
SELECT 8,5 

/*Answer*/ 
;WITH T 
    AS (SELECT *, 
       DENSE_RANK() OVER (ORDER BY 
         CASE 
         WHEN Batch IN (SELECT Batch 
             FROM @tableA 
             WHERE ID IN (3, 8)) 
         THEN 0 
         ELSE 1 END, Batch) AS NB 
     FROM @tableA) 
UPDATE T 
SET New_Batch = NB 

SELECT * 
FROM @tableA 
+0

select 문이 변경되면 코드를 변경하고 싶지 않습니다. 이것이 제가 하드 코드라는 것을 의미합니다! 쿼리 주셔서 감사합니다 –

+0

그럼 잘 알려진 방법 중 하나를 사용하여 매개 변수의 변수 목록을 전달해야합니다. 예 : http://www.sommarskog.se/arrays-in-sql.html을 참조하십시오. –