2014-12-28 1 views
6

я получил набор данных, как следоватьномер Переустановка Row в соответствии с изменением записи данных

name date 
x  2014-01-01 
x  2014-01-02 
y  2014-01-03 
x  2014-01-04 

и я пытаюсь получить этот результат

name date   row_num 
x  2014-01-01  1 
x  2014-01-02  2 
y  2014-01-03  1 
x  2014-01-04  1 

Я попытался запустить этот запрос

select name, 
     date, 
     row_number() over (partition by name order by date) as row_num 
from myTBL 

, но, к сожалению, я получаю этот результат

name date   row_num 
x  2014-01-01  1 
x  2014-01-02  2 
y  2014-01-03  1 
x  2014-01-04  3 

, пожалуйста, помогите.

+1

какая база данных - сервер sql, оракул и т. Д.? какова логика для назначения номера строки таким образом? что вы пытаетесь сделать наконец? –

+0

В заявлении 'partition by' говорится, что разделы основаны исключительно на' name'. В результате вы получили результат, о котором вы просили. Результат, который вам кажется желательным, состоит в том, что разделы переустанавливаются каждый раз, когда изменяется * запуск * имени. Я не думаю, что вы можете сделать это с помощью простой функции окна. Вам потребуется один или два уровня подзапроса. –

+2

Для будущих искателей это относится к классу проблем, известных как [тег: пробелы и острова]. –

ответ

10

Необходимо идентифицировать группы names, которые происходят вместе. Вы можете сделать это с разницей чисел строк. Затем используйте grp для разделения row_number():

select name, date, 
     row_number() over (partition by name, grp order by date) as row_num 
from (select t.*, 
      (row_number() over (order by date) - 
       row_number() over (partition by name order by date) 
      ) as grp 
     from myTBL t 
    ) t 

Для ваших данных образца:

name date   1st row_number 2nd  Grp 
x  2014-01-01   1   1  0 
x  2014-01-02   2   2  0 
y  2014-01-03   3   1  2 
x  2014-01-04   4   3  1 

Это должно дать вам представление о том, как она работает.

+1

Блестящий, он работал очень хорошо. – erezlale

+0

Это очень полезное решение, потому что оно должно работать с любой базой данных, которая поддерживает 'ROW_NUMBER()' (это большая их часть) +1. –

 Смежные вопросы

  • Нет связанных вопросов^_^