2012-05-05 54 views
3

を使用して、グループとランクによって結果の確認:私は何をしたいかは、私は次のような構造を持つテーブルがSQL

id   timestamp  area 
717416915 18:30:53.063 25.691601 
717416915 18:31:34.863 31.200506 
717416915 18:32:23.665 25.690088 
1994018321 18:32:45.467 37.409171 
1994018321 18:33:19.612 37.409171 
424164505 18:36:16.634 18.22091 
424164505 18:36:36.899 18.210754 
424164505 18:37:08.614 19.829266 
2394018356 18:37:27.231 79.31705 

は、私がid当たりの面積を特定できるような方法で値を要約することですtimestampで注文します。私が最初にarea値を望んでいた場合例えば、それは次のようになります。

id   timestamp  area_1 
717416915 18:30:53.063 25.691601 
1994018321 18:32:45.467 37.409171 
424164505 18:36:16.634 18.22091 
2394018356 18:37:27.231 79.31705 

そして、私はid毎秒area値を取得したい場合には、次のようになります。

id   timestamp  area_2 
717416915 18:31:34.863 31.200506 
1994018321 18:33:19.612 37.409171 
424164505 18:36:36.899 18.210754 

私がいることを理解します私は時間単位でソートし、最初の値をidで特定する必要があります。私はこれをどうやって行うのかよく分かりません。私がやったことは次の通りです(これは実行中ではありません。なぜなら、OVER関数の使用方法はまだ不明です)。

WITH T AS (
    SELECT * OVER(PARTITION BY a.id ORDER BY a.timestamp) AS rnk 
    FROM mytable AS a 
) 
SELECT area as area_1 
FROM T 
WHERE rnk = 1 
GROUP BY a.id 
ORDER BY a.timestamp; 

私はidあたり、後続の面積値を取得するには、などrnk=2を使用することを計画していました。

+0

「id = 2394018356」というレコードはありません – wildplasser

+0

@wildplasser good catch;固定質問。 – djq

答えて

6

次のような構文は次のようになります。dbasemanのヒント@

SELECT RANK() OVER(PARTITION BY a.id ORDER BY a.timestamp) AS rnk 
1

は(あなたのクエリに修正して)正常に動作します:

SELECT DISTINCT 
     id 
    , nth_value(ts, 1) OVER w AS ts 
    , nth_value(area, 1) OVER w AS area_n 
FROM tbl 
WINDOW w AS (PARTITION BY id ORDER BY ts); 

WITH t AS (
    SELECT * 
     , rank() OVER(PARTITION BY id ORDER BY ts) AS rnk 
    FROM tbl 
) 
SELECT id, ts, area AS area1 
FROM t 
WHERE rnk = 1 
ORDER BY id, ts; 

が短く方法があり

それが速ければテストしなければならないでしょう。同様に実行する必要があります。
More about PostgreSQL's arsenal of window functions in the manual.

+0

ありがとうございましたErwin - 私は窓関数を知らなかった。 – djq

関連する問題