एसक्यूएल सर्वर: DENSE_RANK () - एसक्यूएल-सर्वर, अनुक्रम, घने-रैंक

मेरे पास एक टेबल है: (आईडी इंट, बैच इंट, 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 batch from tableA where id in (3,8))
  1. अब इस चुनिंदा कथन के लिए, हमें बैच = 02 मिलते हैंऔर बैच = 5। अब मैं new_batch को असाइन करना चाहता हूं, जैसे कि चयनित स्टेटमेंट का परिणाम पहले (बैच02 फिर बैच05) और शेष डेटा को बैच स्टेटमेंट के बढ़ते क्रम में नहीं चुना जाना चाहिए। (बैच 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