如何为每个组的成员生成序号
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
我有一个与此类似的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