2016-09-20 11 views
1

フィルタリングが必要なファイルが数千件あります。 データのサンプルを以下に示します。これらは学校のテストスコアです。ソースはフラットファイル(csv) 目標はレコードをフィルタリングし、各ID番号の01/15/2016 12:00に最も近いレコードを1つだけ出力することです これは可能ですか?そう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

- SQL Serverがそうであるファイルへの直接アクセスを持っている場合、おそらくOPENQUERY/OPENROWSETを使用しています。しかし、ほとんどの場合、それはファイルを一種のテーブルに引っ張って、あなたが上に持っているものとほとんど同じものを実行することを含むでしょう。他のデータに参加する必要がある場合は、そのクエリのOUTER APPLYを設定ベースの方法で結果を取得することが考えられます。 –

+0

残念ながら、私は希望の結果を得るためにSSISを使用しなければなりません。私たちはSQLデータベースではなくCSVソースファイルを扱っています。指定された日付に最も近い日付の行をプルしなければならず、行の数が常に異なるため行番号は使用できません。 – Andrew

+0

したがって、.csvファイルをインポートしていて、ssisを使用して行を新しい.csvファイルにエクスポートしていますか?プロセスのどの時点でもデータベースは含まれていませんか? –

関連する問題