我有一个包含数千条需要过滤的记录的文件。 下面提供了数据样本。这些是学校的考试成绩。源是一个平面文件(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
答案 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