2011-09-19 64 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 –