0

我有一个数据库表:

id | date       | position | name
--------------------------------------
1  | 2016-06-29 | 9        | Ben Smith
2  | 2016-06-29 | 1        | Ben Smith
3  | 2016-06-29 | 5        | Ben Smith
4  | 2016-06-29 | 6        | Ben Smith
5  | 2016-06-30 | 2        | Ben Smith
6  | 2016-06-30 | 2        | Tom Brown
7  | 2016-06-29 | 4        | Tom Brown
8  | 2016-06-30 | 2        | Tom Brown
9  | 2016-06-30 | 1        | Tom Brown

如何有效地查询表,以便使用 array_agg() 获取新列。

我已经尝试过以下查询,但是它非常慢而且错误,因为它没有按名称列对 previous_positions 进行分组:

SELECT 
j.*,
(SELECT array_agg(id) FROM jockeys j2 WHERE j2.id < j.id)
FROM jockeys j

我希望表格输出看起来像这样

id | date       | position | name      | previous_positions
----------------------------------------------------------
1  | 2016-06-29 | 9        | Ben Smith | {}
2  | 2016-06-29 | 1        | Ben Smith | {9}
3  | 2016-06-29 | 5        | Ben Smith | {9,1}
4  | 2016-06-29 | 6        | Ben Smith | {9,1,5}
5  | 2016-06-30 | 2        | Ben Smith | {9,1,5,6}
6  | 2016-06-30 | 2        | Tom Brown | {}
7  | 2016-06-29 | 4        | Tom Brown | {2}
8  | 2016-06-30 | 2        | Tom Brown | {2,4}
9  | 2016-06-30 | 1        | Tom Brown | {2,4,2}
4

1 回答 1

0

您可以使用WINDOWarray_agg 的子句

SELECT 
j.* ,  array_agg(position) over w as previous_positions
FROM jockeys j
WINDOW w as
(  partition by name ORDER BY id rows between 
     unbounded preceding and 1 preceding
     )

演示

于 2019-04-06T05:45:57.563 回答