I created simple table to illustrate my problem:
x
DECLARE @Test TABLE
(
id int,
Type VARCHAR(10),
SectionId int
)
Insert into @Test
SELECT 1,'RED', 100
UNION ALL SELECT 2, 'RED', 100
UNION ALL SELECT 3, 'BLUE', 100
UNION ALL SELECT 4, 'RED', 200
UNION ALL SELECT 5, 'BLUE', 200
UNION ALL SELECT 6, 'RED', 300
UNION ALL SELECT 7, 'BLUE', 300
UNION ALL SELECT 8, 'BLUE', 300
So I want to give row number to each row but repeat it when Type and SectionId is the same:
id, Type, SectionId, RowNumber
1, 'RED', 100 1
2, 'RED', 100 1
3, 'BLUE',100 2
4, 'RED', 200 1
5, 'BLUE',200 2
6, 'RED', 300 1
7, 'BLUE',300 2
8, 'BLUE',300 2
if I try ROW_NUMBER() Over (Partition by SectionId, Type Order by id)
I will get result like that:
id, Type, SectionId, RowNumber
1, 'RED', 100 1
2, 'RED', 100 2
3, 'BLUE',100 1
4, 'RED', 200 1
5, 'BLUE',200 1
6, 'RED', 300 1
7, 'BLUE',300 1
8, 'BLUE',300 2
Please tell me if there are any way to do that.
Database that I used is Microsoft SQL Server (ver. 14.00.3045)
Advertisement
Answer
Use dense_rank()
instead of row_number()
:
SELECT id, type, sectionid
, dense_rank() OVER (PARTITION BY sectionid ORDER BY type DESC) AS RowNumber
FROM test
ORDER BY id;
id Type SectionId RowNumber
---------- ---------- ---------- ----------
1 RED 100 1
2 RED 100 1
3 BLUE 100 2
4 RED 200 1
5 BLUE 200 2
6 RED 300 1
7 BLUE 300 2
8 BLUE 300 2