Добавить номер строки с помощью оконных функций

У меня есть следующая таблица на входе:

FootnoteField               FootnoteText
Field1                      blabla
Field2                      blabla 
Field3                      blabla 
Field4                      zzzzzzzzzz 
Field5                      blablabla 
Field6                      ploof 

Как я могу добавить инкрементный целочисленный столбец, который назначает одно и то же целое число для строк, где FootnoteText идентичен? Вот чего я хочу здесь достичь:

FootnoteField                   FootnoteText       Number
Field1                          blabla               1
Field2                          blabla               1
Field3                          blabla               1
Field4                          zzzzzzzzzz           2
Field5                          blablabla            3
Field6                          ploof                4

person BuZz    schedule 23.09.2013    source источник
comment
какая версия SQL сервера?   -  person Roman Pekar    schedule 23.09.2013
comment
Вам нужен этот номер, заказанный FootnoteField?   -  person Roman Pekar    schedule 23.09.2013


Ответы (2)


Если вам не нужны данные, упорядоченные FootnoteField, вы можете воспользоваться ответом GoatCo.

Но если вы это сделаете, то:

with cte as (
    select
        FootnoteText, FootnoteField,
        min([FootnoteField]) over(partition by FootnoteText) as min_FootnoteText
    from Table1
)
select 
    FootnoteText, FootnoteField,
    dense_rank() over(order by min_FootnoteText)
from cte

демонстрация скрипта sql

person Roman Pekar    schedule 23.09.2013
comment
@GoatCO блин, спасибо, подумал о накопленных за последнее время суммах и о том, как это не работает в SQL Server 2008 :( - person Roman Pekar; 23.09.2013

Вы, вероятно, захотите DENSE_RANK():

SELECT *, DENSE_RANK() OVER(ORDER BY FootnoteText)
FROM YourTable

Вам нужно PARTITION BY только в том случае, если вы хотите, чтобы нумерация начиналась заново для каждого значения в некоторой группе, т.е. для каждого дня я хочу, чтобы нумерация начиналась с 0, поэтому PARTITION BY Some_Date

Демонстрация: SQL Fiddle

person Hart CO    schedule 23.09.2013
comment
пожалуйста, создайте с ним демонстрацию sqlfiddle :) - person Roman Pekar; 23.09.2013
comment
идет ... скрипт sql имеет проблемы - person Hart CO; 23.09.2013
comment
Пытался создать скрипку, чтобы доказать, что вы правы .. работает на sqlexpress прямо здесь - хорошо, что текст для ddl все еще работает;) - person ; 23.09.2013
comment
Скрипка отправлена. Если бы он был упорядочен с помощью FootnoteField, каждая строка имела бы другое значение. - person Hart CO; 23.09.2013
comment
@GoatCO, я не о том. В строке вывода OP с blablabla есть номер 3, в вашем выводе - номер 2 - person Roman Pekar; 23.09.2013
comment
Таким образом, это выглядит как плотный_ранк, но вы должны упорядочить его по FootnoteField - person Roman Pekar; 23.09.2013
comment
@RomanPekar А, я понимаю, что вы говорите, нужно будет посмотреть, что было после OP. - person Hart CO; 23.09.2013
comment
большое спасибо, ребята. Оба решения имеют значение для моей проблемы, однако, данные, упорядоченные с помощью FootnoteField, больше подходят для моей цели. - person BuZz; 23.09.2013