一点背景:我有一个表在我的Postgres数据库
daily(date date,股票VARCHAR(10), adjusted_close FLOAT),例如
日期 | 票号 | adjusted_close | 2021-02-01 | ABC | 23.2 |
---|---|---|
2021-02-01 | CCC | 222.2 |
2021-02-02 | ABC | 24.2 |
2021-02-02 | CCC | 220.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)