Похоже, что вы ищете просто DENSE_RANK
:
DENSE_RANK() OVER (PARTITION BY [User] ORDER BY [Value] ASC) AS [Row]
Примечание USER
- зарезервированное ключевое слово в T- SQL. Я настоятельно рекомендую вам выбрать другое имя для своего столбца, так как в противном случае вы должны разделить его. ROW
и VALUE
в настоящее время не зарезервированы, но они перечислены как Future Keyword , и их также рекомендуется избегать.
Редактировать: Кажется, на самом деле что 'A'
равно 1
, а затем также увеличивается. Это грязно, но вы можете сделать следующее:
SELECT CASE [Value]
WHEN 'A' THEN 1
ELSE ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Value]) -
COUNT(CASE [Value] WHEN 'A' THEN 1 END) OVER (PARTITION BY [User]) + 1
END AS [Row],
V.[Value],
V.[User]
FROM (VALUES ('A', 'Rick'),
('A', 'Rick'),
('B', 'Rick'),
('C', 'Rick'),
('A', 'Joe '),
('B', 'Joe '),
('B', 'Joe ')) V ([Value], [User]);
Это предполагает , что всегда будет хотя бы одна строка с 'A'
.
Править 2: Хорошо, сообщения цели были перемещены снова, это теперь делает то, что вы после. Если они переместятся снова, вам нужно будет изменить решение, хотя:
WITH YourTable AS(
SELECT V.ID,
V.Value,
V.[User]
FROM (VALUES(1,'A','Rick'),
(2,'A','Rick'),
(3,'B','Rick'),
(7,'A','Rick'),
(8,'C','Rick'),
(4,'A','Joe '),
(5,'B','Joe '),
(6,'B','Joe '))V(ID,[Value],[User])),
Grps AS(
SELECT YT.ID,
YT.Value,
YT.[User],
COUNT(CASE YT.[Value] WHEN 'A' THEN 1 END) OVER(PARTITION BY YT.[User] ORDER BY YT.ID) AS Grp
FROM YourTable YT)
SELECT ID,
CASE G.[Value]
WHEN 'A' THEN 1
ELSE ROW_NUMBER() OVER (PARTITION BY G.[User], G.Grp ORDER BY G.[Value]) -
COUNT(CASE G.[Value] WHEN 'A' THEN 1 END) OVER (PARTITION BY G.[User], G.Grp) + 1
END AS [Row],
G.[Value],
G.[User]
FROM Grps G
ORDER BY G.[User], G.ID;