2011-09-19 86 views
-1

我有一個表A: (ID 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 batch from tableA where id in (3,8)) 
  1. 現在這個select語句,我們得到了一批= 02和批= 5。現在我想分配new_batch,這樣select語句的結果應該先排序(batch02然後是batch05),剩下的數據應該按照批次NOT的順序在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 

感謝。 PS:DENSE_RANK()可以使用,請不要硬編碼!

+0

不要硬代碼是什麼?你認爲有人會給你8條更新聲明嗎? –

+0

不,我的意思是不一樣的情況下批量使用時,2然後1等你不會相信我在其他論壇*多麼可笑的反應獲得。* –

+0

所以,如果你有一個'其中id在(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 –