Najprostszym (i prawdopodobnie najbardziej wydajnym) podejściem jest użycie ROW_NUMBER()
:
SELECT [Date], Code, [Count] = ROW_NUMBER() OVER (PARTITION BY Code ORDER BY [Date])
FROM dbo.YourTableName
ORDER BY [Date];
Dla zabawy możesz to również rozwiązać w ten sposób w SQL Server 2012. Jeśli Date
jest wyjątkowy:
SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date]
RANGE UNBOUNDED PRECEDING)
FROM dbo.YourTable
ORDER BY [Date];
Lub prościej:
SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date])
FROM dbo.YourTable
ORDER BY [Date];
Jeśli Date
nie jest unikalny, a jeśli nie chcesz remisów (taka sama liczba dla identycznych kombinacji data+kod), musisz użyć droższego ROWS
, który używa na buforze na dysku:
SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date]
ROWS UNBOUNDED PRECEDING)
FROM dbo.YourTable
ORDER BY [Date];
Możesz wypróbować każdą z tych opcji na swoim stole, aby zobaczyć, jak wygląda wydajność.