如何按表分组并创建新列以将原始值放在那里?

时间:2017-11-21 10:19:38

标签: sql postgresql

我在postgresql中有一个表

type id n   occurred_at
A   159 4   2013/12/20 18:05
A   159 5   2013/12/27 18:05
A   159 6   2014/1/20 18:05
A   159 8   2014/3/22 12:34
B   180 5   2014/3/29 12:34
B   180 6   2014/4/22 12:34
C   207 4   2014/3/13 03:24
C   207 8   2014/3/20 03:24
C   207 6   2014/4/13 03:24
D   157 4   2013/12/20 18:07
D   157 5   2013/12/27 18:07
D   157 6   2014/1/20 18:07
D   157 8   2013/1/20 17:41
D   157 8   2013/12/27 17:41
D   157 8   2014/1/20 17:41

我希望不同的n在一行中具有相同的typeid,并按occurred_at排序(n仅适用于6或8) 。结果如下,我试图使用type, id组来获得这个,但似乎很难。 有没有人有更好的想法呢?

A   159  6 8
B   180  6
C   207  8 6
D   157  8 8 6 8  

2 个答案:

答案 0 :(得分:1)

如果您想要以空格分隔的n值列表,可以使用string_agg汇总所有值:

select type, id, string_agg(n::text, ' ' order by occurred_at) as n_values
from the_table
group by type, id;

答案 1 :(得分:0)

我不能100%确定您想要的输出效果,但如果您正在寻找一个独特的" n"基于类型和id的每一行的值,我认为row_number()分析函数会这样做。

select
  type, id,
  row_number() over (partition by type, id order by occurred_at) as n,
  occurred_at
from my_table