2016-08-10 7 views
0

私は結果をテキストファイルにエクスポートするクエリを持っています。コードは以下のとおりです。PostgreSQLからテキストファイルをスライスでエクスポートする(年単位のテキストファイルの配布)

Copy (
     Select 
      foo.gid As addr_ID, 
      bar.geom As streets, 
      St_LineInterpolatePoint 
       (ST_LineMerge(bar.geom), 
        St_LineLocatePoint 
        (St_LineMerge(bar.geom),foo.geom) 
      ) As interpolated_point 
     FROM foo 
     Left JOIN bar ON ST_DWithin(foo.geom, bar.geom, 50) 
     ORDER BY 
     foo.gid, St_Distance(foo.geom, bar.geom) 
    )  
To '~path/my_file.txt' WITH DELIMITER ','; 

テーブル 'foo'には87行が含まれ、 'bar'には16,060行が含まれています。テーブル「FOO」も2列「のstart_time」と、このような変化の年の間隔を描いた「END_TIME」が含まれています

Start_time    End_time 
2003-06-07 00:00:00  2004-09-30 23:59:59 
2004-02-03 00:00:00  2005-03-10 23:59:59 
2003-07-09 00:00:00  2012-05-06 23:59:59 

それは毎年のようにするためのテキストファイルを生成するように私は私の選択クエリの結果をエクスポートしたいと思いますこの:

予想される出力:

results_2003.txt 
results_2004.txt 
results_2005.txt 
and so on... 

誰かがそれを行うにはどのように私を提案することはできますか?私はPostgreSQLバージョン9.5(x64)をWindows 7 Enterprise(x64)で使用しています。

EDIT(1):

テキストファイルは、例えば、毎年のためにエクスポートする必要があります「のstart_time」と「END_TIME」の列では、下限は2003で、上限はその後、2012ファイルである場合期待される成果に示されるように毎年輸出される必要がある。

EDIT(2):

は、これまでのところ、私は完全に動作するコードを開発するために(コードおよび推奨リンクについて@Phillipに多くのおかげで)しようとしているが、私は繰り返し取得していますように私が問題に実行しています構文エラーです。 。私は、コードを掲載している以下のエラーが「構文エラーまたはその付近 『と言う1』(Where句)(再びCREDITはフィリップに行く):。

-- In the below code: Addr, streets, agfisotime (start time in data type timestamp) and agtisotime (end time in data type timestamp) are original columns 

DO $$ 

DECLARE 
start_year date; 
end_year date; 
current_year date; 
file_name text; 
BEGIN 
select date_trunc('year', min(agfisotime)), date_trunc('year', max(agtisotime)) 
    into start_year, end_year 
    from Addr; 

FOR current_year IN 
    SELECT * FROM generate_series(start_year, end_year, interval '1 year') 
LOOP 

Execute format(' 
    Copy(
     Select 
     Addr.gid As addr_ID, 
     streets.geom As streets, 
     St_LineInterpolatePoint(ST_LineMerge(streets.geom), 
      St_LineLocatePoint(St_LineMerge(streets.geom),Addr.geom)) 
      As interpolated_point 
     FROM Addr 
     Left JOIN streets ON ST_DWithin(Addr.geom, streets.geom, 50) 
     WHERE agfisotime < current_year + interval '1 year' 
     AND agtisotime >= current_year 
     ORDER BY 
     Addr.gid, St_Distance(Addr.geom, streets.geom) 
    ) TO ''C:/temp/out.csv''; 
    ',current_year); 

END LOOP; 
RETURN; 
END 
$$ 
+2

2003年に開始して2005年に終了してから、どのファイルを表示する必要がありますか? 2003年、2004年、2005年、またはそれらのすべて? –

+0

@PhilipCouling: 'start_time'と 'end_time'の2つの列には、2003年から2007年の範囲の年が含まれ、各年のテキストファイルを別々にエクスポートする必要があります(その年のすべてのレコードを含む年ごとに1つのファイル)。だから、具体的に答えを与える:それらのすべて。 –

答えて

2

これは非常に複雑ですが、それが可能であるあなたは、基本的な問題がありますあなたが書きたいファイルごとに一度COPYコマンドを起動する必要がある、とあなたは、動的SQLを使用して、そうする必要があるとその説明がここにあります:。Use function variable in dynamic COPY statement

実際に必要にCOPYコマンドを複数回発射するには匿名コードブロックまたは関数を使用して年のリストを取得し、毎年COPYコマンドを実行してエクスポートします。

私は次のようにテストしたのだが、それが正しいデータのエクスポートではないですが、基本的な原則のショー:あなたは結果をフィルタリングする必要があります。各年の

DO $$ 
DECLARE 
    start_year date; 
    end_year date; 
    current_year date; 
    file_name text; 
BEGIN 
    select date_trunc('year', min(start_time)), date_trunc('year', max(end_time)) 
     into start_year, end_year 
     from foo; 

    FOR current_year IN 
     SELECT * FROM generate_series(start_year, end_year, interval '1 year') 
    LOOP 

    file_name := '/tmp/myFile_' || extract(year from current_year) || '.csv'; 

    --- do your export here using current_year to filter the results 
    EXECUTE format(' 
     COPY (
      select start_time, end_time from foo 
     WHERE start_time < %L::date + interval ''1 year'' 
      AND end_time >= %L::date 
     ) 
     TO %L WITH DELIMITER '',''; 
     ', 
    current_year, current_year, file_name); 


    END LOOP; 
END 
$$; 

を。したがって、クエリは次のようになります(未テスト)。

EXECUTE format(' 
    COPY (
Select 
    foo.gid As addr_ID, 
    bar.geom As streets, 
    St_LineInterpolatePoint 
     (ST_LineMerge(bar.geom), 
      St_LineLocatePoint 
      (St_LineMerge(bar.geom),foo.geom) 
    ) As interpolated_point 
FROM foo 
Left JOIN bar ON ST_DWithin(foo.geom, bar.geom, 50) 
WHERE start_time < %L::date + interval ''1 year'' 
     AND end_time >= %L::date 
ORDER BY 
foo.gid, St_Distance(foo.geom, bar.geom) 

    ) 
    TO %L WITH DELIMITER '',''; 
    ', 
current_year, current_year, file_name); 
+0

ありがとうございます。しかし、私は断片を縫い合わせて完全な作業コードを作成しようとしましたが、構文エラーが発生しています。私はまた、スタックオーバーフローリンクで与えられた動的EXECUTE format()構造に従っていますが、エラーを修正することはできません。 –

+0

私は質問を編集し、私が得ているエラーの詳細を追加しました。 –

+1

問題の1つのように見えるのは、間隔のために引用符をエスケープしていないことです。たとえば、「1年」は「1年」になります。私はいくつかのテストを行い、ここにいくつかの問題があることが分かったので、答えを編集します。 –

関連する問題