/ / SQL Server: DENSE_RANK () - sql-сервер, послідовність, щільний ранг

SQL Server: DENSE_RANK () - sql-сервер, послідовність, щільний-ранг

У мене є таблицяA: (ID int, пакет 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. тепер для цього вибору оператора ми отримуємо пакет = 02і партія = 5. Тепер я хочу призначити new_batch таким чином, щоб результат вибору оператор повинен бути замовлений перший (batch02, то batch05), а інші дані повинні бути впорядковані в зростаючому порядку партії НЕ в вибір. (партія 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 для відповіді № 1
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 для відповіді № 2
/*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