如何为每个组的成员生成序号

How to generate sequence number for members of each group

我有一个与此类似的table:

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)
)

我正在从一个仅包含报告名称和组名称的平面文件导入此 table,因此我需要生成 SequenceNumber。对于每个报告,序列号应从 1 重新开始。

我已经看到如何使用脚本任务为正常序列号执行此操作,但似乎没有为每个新报告名称重新启动。我的猜测是我需要使用排序转换,然后添加代码来检查报告名称的变化(?)有人做过这样的事情吗?有什么示例代码可以分享吗?

是的,我已经按照你描述的那样做了;对数据流中的数据进行排序并使用脚本分配序列号,每次特定列的值更改时重新启动。

不,我手边没有任何示例代码。很久以前了。

如果我今天这样做,并且能够使用暂存 table,我会按原样将数据导入暂存 table,然后调用使用的存储过程ROW_NUMBER() 分配目标中的序号 table.

如我所料,这可以通过添加排序转换然后调整脚本转换来实现。我在 ReportName->GroupName 上添加了排序,然后将以下代码添加到脚本转换中:

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;
    }
}

我删除了帮助和注释,使此处的代码更加简洁和可读。

SELECT
    ROW_NUMBER() OVER(PARTITION BY ReportName ORDER BY ReportName) As Sequence,
    ReportName,
    GroupName,
FROM ReportGroups