使用 FIRST_VALUE 而不在分组依据中包含内部列

Cyb*_*noe 8 sql postgresql vertica

我正在使用一个看起来像这样的表:

userID, eventDate, eventName
1  2019-01-01  buySoup
2  2019-01-01  buyEggs
2  2019-01-03  buyMilk
2  2019-01-04  buyMilk
3  2019-01-02  buyBread
3  2019-01-03  buyBread
Run Code Online (Sandbox Code Playgroud)

我当前的查询是:

userID, eventDate, eventName
1  2019-01-01  buySoup
2  2019-01-01  buyEggs
2  2019-01-03  buyMilk
2  2019-01-04  buyMilk
3  2019-01-02  buyBread
3  2019-01-03  buyBread
Run Code Online (Sandbox Code Playgroud)

我觉得这应该返回:

userID, firstBought
1  buySoup
2  buyEggs
3  buyBread
Run Code Online (Sandbox Code Playgroud)

相反,它给出了错误:

'错误:列“table.eventName”必须出现在 GROUP BY 子句中或在聚合函数中使用'

有没有办法获取这个值而不将其包含在按函数分组或创建子查询中?我正在使用 PostgreSQL。

如果我确实将其包含在 group by 子句中,它将返回

userID, firstBought
1  buySoup
2  buyEggs
2  buyEggs
2  buyEggs
3  buyBread
3  buyBread
Run Code Online (Sandbox Code Playgroud)

我知道我可以将其设为子查询,然后按 userID、firstBought 进行分组,但我不想创建另一个子查询。

Gor*_*off 8

而不是group by使用select distinct

select distinct userID,
       FIRST_VALUE(eventName) over (partition by userID order by eventDate ASC) as firstBought 
from table ;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用数组:

select userId,
       (array_agg(eventName order by eventDate))[1] as firstBought
from table
group by userId;
Run Code Online (Sandbox Code Playgroud)

Postgres 没有“第一个”聚合函数,但是这个函数运行得很好。