2016-09-20 57 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文件?在這個過程的任何時候都沒有涉及數據庫? –