2016-07-15 8 views
0

私はタイムゾーン形式のタイムスタンプ(「時間」と呼ばれる)のデータテーブルを持っています。私はまた、間隔のデータ型の値を取る空のテーブルを持っています。空のテーブルの各行について、その行のタイムスタンプと元のデータの間隔の差と、元のデータの全体的な最小タイムスタンプの値との差を挿入します。Postgresの全体最小値から各値の差を取得

INSERT INTO 
    time_pyramid 
SELECT 
    "time" - MIN("time") 
FROM 
    time_raw; 

をしかし、それは私が「ERROR:コラム 『伝える:私はこのような何かをしようとしているtime_raw.timeは』 GROUP BY句に現れなければならないか、集約関数で使用されます」。私はテーブルの全体的な最小タイムスタンプ値から各タイムスタンプ値の間隔の差を求め、 "時間"はこのインターバル変換から重複した値を持つことになりませんので、実際にはそのコンテキストでGROUP BYを使うべきだとは思わない。最初の「時間」に集計関数を使用する理由もないので、私が望むものを反映するようにクエリを修正するにはどうすればよいですか?

編集:実は、「分からの間隔差としてそれぞれの値を取得します」window functionとして、この質問

答えて

1

のためのより良いタイトルを使用するmin()です:

with time_raw("time") as (
    values 
     ('2016-01-11'::timestamp), 
     ('2016-01-01'::timestamp), 
     ('2016-01-21'::timestamp) 
) 

select 
    "time"- min("time") over() as interval 
from 
    time_raw; 

interval 
---------- 
10 days 
00:00:00 
20 days 
(3 rows) 
+0

うわー、私は私が持っているだろうと思いますウィンドウ関数を読み上げる。ありがとう、これは私が必要なものです。 – Ben

+0

'(time)over()'は構文的に分割できないことに注意してください。 '(extract(time) - min(" time ")over())* 1000000):: bigint'を使用してください。 – klin

+0

はい括弧のまわりを移動してover()を内側に置くことが分かりました。窓関数を集合体に結びつけることを覚えておくとよいでしょう。 – Ben

関連する問題