根据最近的日期过滤行

时间:2016-09-20 12:11:52

标签: ssis sql-server-data-tools ssis-2012 ssis-2008

我有一个包含数千条需要过滤的记录的文件。 下面提供了数据样本。这些是学校的考试成绩。源是一个平面文件(csv) 目标是过滤记录,并且每个ID号仅输出最接近01/15/2016 12:00的一条记录 这是可能的,如果是这样,你会如何使用SSIS或SSDT这样做?我不确定是否可以使用条件拆分,派生列等来完成,以及使用哪个命令来获得最接近所需日期和时间的行。非常感谢提前!!!

来自csv源文件的数据样本

ID, FNAME, LNAME, DATE, SCORE1, SCORE2, SCORE3 1, JOHN, DOE, 12/11/2015 7:44, 100, 99, 98 1, JOHN, DOE, 12/29/2015 11:45, 99, 100, 96 1, JOHN, DOE, 1/10/2016 11:46, 98, 97, 97 1, JOHN, DOE, 1/20/2016 8:47, 97, 98, 99 1, JOHN, DOE, 3/20/2016 11:48, 96, 96, 100 2, JANE, DOE, 12/12/2015 11:44, 100, 99, 98 2, JANE, DOE, 12/28/2015 11:45, 99, 100, 96 2, JANE, DOE, 1/9/2016 11:46, 98, 97, 97 2, JANE, DOE, 1/23/2016 9:47, 97, 98, 99 2, JANE, DOE, 3/8/2016 8:48, 96, 96, 100 3, CHRIS, DOE, 2/8/2016 8:00, 100, 100, 100

将写入csv平面文件目标的所需结果将是 ID, FNAME, LNAME, DATE, SCORE1, SCORE2, SCORE3 1, JOHN, DOE, 01/10/2016 11:46, 98, 97, 97 2, JANE, DOE, 01/9/2016 11:46, 98, 97, 97 3, CHRIS, DOE, 2/8/2016 8:00, 100, 100, 100

1 个答案:

答案 0 :(得分:3)

我会通过将整个.csv导入到临时表,然后运行使用ROW_NUMBER()的存储过程来获取每个ID的所需行,并将该行仅复制到最终目标表来实现此目的

这比在SSIS数据流中尝试处理它有更好的性能。

实施例

SELECT 
    ID,
    FNAME, 
    LNAME, 
    DATE, 
    SCORE1, 
    SCORE2, 
    SCORE3 
FROM (
    SELECT 
        *, 
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE DESC) as RN
    FROM
        YourStagingTable
) a
WHERE 
   a.rn = 1