Как создать порядковый номер для членов каждой группы
У меня есть таблица, которая похожа на это:
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