gpt4 book ai didi

ssis - 删除具有相同键的行

转载 作者:行者123 更新时间:2023-12-03 17:56:50 24 4
gpt4 key购买 nike

我有如下行的数据:

Name1  Name2  Name3  Col  
aaa bbb ccc ...
abc ddd ddd 1
abc ddd ddd 2
abc ddd ddd 3
fff fff fff ...
ggg ggg hhh 4
ggg ggg hhh 5

( Name1Name2Name3 为主键)

如何从具有相同 3 个主键的数据集中删除第一行? (只留下集合的最后一行)

IE。上面的结果将是:
Name1  Name2  Name3  Col  
aaa bbb ccc ...
abc ddd ddd 3
fff fff fff ...
ggg ggg hhh 5

最佳答案

假设您的源数据的顺序正确,并且您想要每个集合中的最后一条记录,则没有任何开箱即用的转换可以处理这种情况。但是,脚本转换可以很容易地处理它。

这是一个示例数据流:

enter image description here

我正在使用 FF_SRC_AllRowsFF_DST_SelectedRows为简单起见,使用您提供的示例数据作为平面文件源和目标(分别);您的具体需求会有所不同。脚本转换SCR_SelectLastRow配置为转换(输入和输出):

enter image description here

选择所有输入列(使用类型 ReadOnly ):

enter image description here

创建一个输出(我命名为 OutgoingRows ,但您可以随意命名),并设置 SynchronousInputID属性(property)到None .这将使您的脚本过滤掉您不想要的行。

enter image description here

添加与输入列对应的输出列:

enter image description here

并使用以下代码:

/* Microsoft SQL Server Integration Services Script Component
* Write scripts using Microsoft Visual C# 2008.
* ScriptMain is the entry point class of the script.*/

using System;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
class IncomingRowData
{
public string Name1;
public string Name2;
public string Name3;
public string Col;
public IncomingRowData(IncomingRowsBuffer Row)
{
Name1 = Row.Name1;
Name2 = Row.Name2;
Name3 = Row.Name3;
Col = Row.Col;
}
public bool KeysDiffer(IncomingRowData other)
{
return (Name1 != other.Name1
|| Name2 != other.Name2
|| Name3 != other.Name3);
}
public void WriteToOutputBuffer(OutgoingRowsBuffer Row)
{
Row.AddRow();
Row.Name1 = Name1;
Row.Name2 = Name2;
Row.Name3 = Name3;
Row.Col = Col;
}
}

private IncomingRowData _previousRow;

public override void IncomingRows_ProcessInputRow(IncomingRowsBuffer Row)
{
if (_previousRow == null)
{
_previousRow = new IncomingRowData(Row);
}
IncomingRowData currentRow = new IncomingRowData(Row);
if (currentRow.KeysDiffer(_previousRow))
{
_previousRow.WriteToOutputBuffer(this.OutgoingRowsBuffer);
}
_previousRow = currentRow;
}

public override void FinishOutputs()
{
if (_previousRow != null)
{
_previousRow.WriteToOutputBuffer(this.OutgoingRowsBuffer);
}
base.FinishOutputs();
}
}

这种技术的一个好处是它允许您一次性处理数据,既不需要使用临时表,也不需要将整个源数据集保存在内存中。根据您的数据集有多大,其中任何一个都可能导致严重的性能问题。

关于ssis - 删除具有相同键的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15192774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com