将两列和行聚合为一列

Gui*_*nda 4 sql postgresql aggregate aggregate-functions

我有以下表结构

start|end
09:00|11:00
13:00|14:00
Run Code Online (Sandbox Code Playgroud)

我知道

SELECT ARRAY_AGG(start), ARRAY_AGG(end)
Run Code Online (Sandbox Code Playgroud)

将会导致

start|end
[09:00,13:00]|[11:00,14:00]
Run Code Online (Sandbox Code Playgroud)

但我怎样才能得到下面的结果呢?结果

[09:00,11:00,13:00,14:00]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我正在使用 Postgres

Gab*_*ger 5

您可以进行数组串联(如果顺序不重要):

SELECT ARRAY_AGG(start) || ARRAY_AGG(end) FROM TABLE1
Run Code Online (Sandbox Code Playgroud)

如果顺序很重要,您可以使用戈登的方法,但是

  • 添加聚合订单array_agg(d order by d ASC)
  • 使用unnest代替union all,因为戈登的解决方案 ( union all) 执行两次序列扫描。如果表很大,使用以下方法可能会提高性能:

    SELECT array_agg(d ORDER BY d ASC) FROM(
        SELECT unnest(ARRAY[start] || ARRAY[end]) as d from table1
    ) sub
    
    Run Code Online (Sandbox Code Playgroud)

它只对表执行一次序列扫描(并且会更快)。