5

次の構造のテーブルがあります。

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

そして、私がそれareaごとidに2番目の値を取得したい場合は、次のようになります。

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;

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

4

2 に答える 2

11

構文は次のとおりです。

SELECT RANK() OVER(PARTITION BY a.id ORDER BY a.timestamp) AS rnk
于 2012-05-05T23:40:53.367 に答える
2

@dbaseman のヒントは正常に機能します (クエリを修正すると):

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;

もっと短い方法があります:

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);

それがより速いかどうかもテストする必要があります。同様に実行する必要があります。
PostgreSQL のウィンドウ関数の詳細については、マニュアルを参照してください。

于 2012-05-06T00:25:38.017 に答える