Как создать порядковый номер для членов каждой группы

У меня есть таблица, которая похожа на это:

CREATE TABLE dbo.ReportGroups (
    ReportName     VARCHAR(50)    NOT NULL,
    GroupName      VARCHAR(50)    NOT NULL,
    SequenceNumber SMALLINT       NOT NULL,
    CONSTRAINT PK_ReportGroups PRIMARY KEY CLUSTERED (ReportName, GroupName)
)

Я импортирую в эту таблицу из плоского файла, который содержит только имена отчетов и имена групп, поэтому мне нужно сгенерировать SequenceNumber. Для каждого отчета порядковые номера должны начинаться с 1.

Я видел, как это сделать с помощью задачи сценария для нормальных порядковых номеров, но перезапуска для каждого нового имени отчета, похоже, нет. Я предполагаю, что мне нужно использовать преобразование Sort, а затем добавить код для проверки изменений в имени отчета (?) Кто-нибудь сделал что-то подобное? Любой пример кода, чтобы поделиться?

3 ответа

Решение

Как я и подозревал, это было возможно, добавив преобразование Sort, а затем настроив преобразование Script. Я добавил Sort on ReportName->GroupName и добавил следующий код в преобразование Script:

public class ScriptMain : UserComponent
{
    short seqNum;
    string reportName;

    public override void PreExecute()
    {
        base.PreExecute();

        seqNum = 0;
        reportName = "";
    }

    public override void PostExecute()
    {
        base.PostExecute();
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (Row.MapName != reportName)
        {
            reportName = Row.MapName;
            seqNum = 1;
        }
        else
            seqNum++;

        Row.SequenceNumber = seqNum;
    }
}

Я удалил помощь и комментарии, чтобы сделать код немного более сжатым и читаемым здесь.

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

И нет, у меня нет примера кода под рукой. Это было давно.

Если бы я делал это сегодня и смог использовать промежуточную таблицу, я бы импортировал данные как есть в промежуточную таблицу, а затем вызвал сохраненный процесс, который использовал ROW_NUMBER() для назначения порядковых номеров в целевой таблице.

SELECT
    ROW_NUMBER() OVER(PARTITION BY ReportName ORDER BY ReportName) As Sequence,
    ReportName,
    GroupName,
FROM ReportGroups
Другие вопросы по тегам