2016-03-17 1 views
2

У меня есть требование для записей ниже.Генерация номера строки SQL Server

Status Date 
Active 17Mar2016 
Active 17Mar2016 
Inactive 17Mar2016 
Active 18Mar2016 
Inactive 18Mar2016 
Inactive 18Mar2016 
Inactive 19Mar2016 

И у меня есть столбец с данными, как показано ниже.

Status Date   Row 
Active 17Mar2016  1 
Active 17Mar2016  2 
Inactive 17Mar2016  1 
Active 18Mar2016  1 
Inactive 18Mar2016  1 
Inactive 18Mar2016  2 
Inactive 19Mar2016  3 
Active 19Mar2016  1 

Для каждого изменения статуса мне нужно начинать номер строки с 1 и продолжать.

Пожалуйста, дайте мне знать любую подсказку по этому вопросу.

+0

google rank или row_number –

+1

Откуда берутся последние записи? –

ответ

3

Ваш вопрос немного сложный, потому что вам нужно идентифицировать группы смежных значений. Существует трюк, связанный с различием номеров строк. Остальное просто row_number() используя группировку:

select status, date, 
     row_number() over (partition by status, grp order by date) as row 
from (select t.*, 
      (row_number() over (order by date) - 
       row_number() over (partition by status order by date) 
      ) as grp 
     from t 
    ) t; 

EDIT:

т-Клаузен делает очень хороший момент. Предоставленные данные не имеют фиксированного ответа. Таблицы SQL представляют неупорядоченные комплекты. Вопрос имеет частичный порядок, основанный на дате. Однако это не стабильный порядок, потому что даты (как указано в вопросе) дублируются. Вышеуказанное работает так же, как возможно, с учетом данных. То, что ему действительно нужно, это уникальный столбец (или набор столбцов), который задает порядок: для столбцов даты или уникального идентификатора характерны такие элементы времени.

+0

Поскольку времени нет, порядок вставки в вашем ответе может дать другой результат, чем текущий. ** (row_number() over (упорядочить по дате, статусу) - ** вместо 4-й строки исправить это –

+1

@ t-clausen.dk ... Это очень хороший момент. Я добавил объяснение в ответ , –