使用SQL按组和排名识别结果

djq*_*djq 5 sql postgresql grouping window-functions

我有一个具有以下结构的表:

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
Run Code Online (Sandbox Code Playgroud)

我想要做的是以这样的方式总结这些值,即我可以识别每个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
Run Code Online (Sandbox Code Playgroud)

如果我想获得第二个area值,id那么将是以下内容:

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
Run Code Online (Sandbox Code Playgroud)

我知道我需要按时间排序,然后确定每个第一个值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;
Run Code Online (Sandbox Code Playgroud)

我计划使用rnk=2等,以获得后续的区域值id.

McG*_*gle 11

语法应如下所示:

SELECT RANK() OVER(PARTITION BY a.id ORDER BY a.timestamp) AS rnk
Run Code Online (Sandbox Code Playgroud)