postgreSQL查询表中每个唯一属性的新列



一点背景:我有一个表在我的Postgres数据库

daily(date date,股票VARCHAR(10), adjusted_close FLOAT),例如

tbody> <<tr>
日期 票号 adjusted_close
2021-02-01ABC23.2
2021-02-01CCC222.2
2021-02-02ABC24.2
2021-02-02CCC220.4

在Postgres中,PIVOT通常使用过滤聚合完成:

select d.date, 
max(d.adjusted_close) filter (where d.ticker = 'ABC') as abc,
max(d.adjusted_close) filter (where d.ticker = 'CCC') as ccc
from daily d
group by d.date;

在你问之前:你不能让它"动态"。在解析查询时和实际执行查询之前,必须知道查询的数量、名称和数据类型。不能在查询开始后才确定列。


另一种选择可能是将单个日期的所有内容聚合为JSON值:

select d.date, 
jsonb_object_agg(d.ticker, d.adjusted_close) as ticker_info
from daily d
group by d.date;

这是为我在mssql工作。希望它也能在Postgres中工作。

DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.ticker) 
FROM daily c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'')

set @query = 'SELECT [date], ' + @cols + ' from 
(
SELECT  [date]
,[ticker]
,[adjusted_close]
FROM daily
) x
pivot 
(
min([adjusted_close])
for [ticker] in (' + @cols + ')
) p '
execute(@query)

最新更新