2016-09-20 58 views
1

我有一个文件,需要过滤的数千条记录。 下面提供了一个数据样本。这些是学校的考试成绩。来源是一个平面文件(csv) 目标是筛选记录,并且只输出一个最接近于2016年1月15日12:00的记录,每个ID号码 这是可能的,如果是这样,您会怎么做所以用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

回答

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 
+0

差不多就是我会做 - 可能使用OPENQUERY/OPENROWSET如果SQL Server有到文件,这是不可能的直接访问。但是大多数情况下,它会涉及将文件拉入各种表格中,并运行与上述类似的内容。如果您需要加入其他数据,我会考虑对该查询进行OUTER APPLY,以仍然以基于集合的方式获得结果。 –

+0

不幸的是,我不得不使用SSIS来达到预期的效果。我们正在使用csv源文件而不是SQL数据库。它必须拉出日期最接近指定日期的行,不能使用行号,因为行数总是不一样。 – Andrew

+0

因此,您正在导入.csv文件,并使用ssis将行导出到新的.csv文件?在这个过程的任何时候都没有涉及数据库? –