SQL Server: DENSE_RANK () - PullRequest
       11

SQL Server: DENSE_RANK ()

0 голосов
/ 20 сентября 2011

У меня есть таблица A: (ID int, batch int, new_batch int)

Идентификатор и партия уже заполнены:

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 мы получаем batch = 02 и batch = 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 () можно использовать, и, пожалуйста, не используйте жесткий код !!

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011
/*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  
2 голосов
/ 20 сентября 2011
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/

...